2011-08-25 24 views
34

Sto sviluppando un progetto Django (1.3) composto da molte applicazioni. Ogni applicazione ha i propri file statici sotto la propria directory static. Inoltre, ho aggiunto una directory chiamata project_static che dovrebbe contenere file statici comuni in varie applicazioni, come jQuery.Gestione di file statici per più app in Django

Il problema a cui mi imbatto immediatamente è quello di denominare le collisioni. Per impostazione predefinita, collectstatic inserirà tutto in una directory globale static, senza classificarli per applicazione. Questo non funziona per me, poiché ogni applicazione ha, per esempio, un file chiamato css/screen.css.

Il modo in cui ho risolto è rimuovendo django.contrib.staticfiles.finders.AppDirectoriesFinder da STATICFILES_FINDERS e l'utilizzo di namespaced static files dirs, quindi le mie impostazioni ora sembra

STATICFILES_DIRS = (
    os.path.join(PROJECT_PATH, 'project_static'), 
    ('my_app', os.path.join(PROJECT_PATH, 'my_app', 'static')), 
    ('another_app', os.path.join(PROJECT_PATH, 'another_app', 'static')), 
    ... 
) 

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder', 
) 

Il problema è che in questo modo perdo i file statici per tutte le altre applicazioni, per istanza django.contrib.admin. Ovviamente potrei aggiungere manualmente l'amministratore, ma non sono sicuro di come farlo senza rompere l'amministratore, che ha una diversa struttura di directory.

C'è un modo migliore per gestire i file statici con più di un'applicazione?

risposta

39

Questo è lo stesso problema che si verifica quando si utilizzano le directory specifiche dell'applicazione templates. Se lanci i file direttamente sotto templates nell'app, finirai con conflitti di nomi se due app o anche la directory templates a livello di progetto utilizzano modelli con lo stesso nome. La correzione per questo è quello di mettere in realtà i modelli in una directory del nome dell'app all'interno della directory templates come:

- some_app 
    - templates 
     - some_app 
      - index.html 

Così, applico la stessa idea di statica:

- some_app 
    - static 
     - some_app 
      - css 
      - img 
      - js 

questo modo quando esegui collectstatic, i singoli file statici di ogni app vengono inseriti in una directory con nomi diversi. L'unica modifica che devi fare è precedere ciascuno dei file con la directory nome-app nei tuoi modelli. Quindi invece di {{ STATIC_URL }}css/style.css hai {{ STATIC_URL }}my_app/css/style.css.

+0

se serviamo i file statici usando nginx è ancora questo il modo preferito? (mantenendo i file statici, i modelli nell'app stessa) – Dineshkumar

+0

Sì. Vuoi che tutte le tue risorse siano gestite con il tuo progetto. –

Problemi correlati