2011-08-25 118 views
34

我正在開發由許多應用程序組成的Django(1.3)項目。每個應用程序在其自己的static目錄下都有自己的靜態文件。此外,我添加了一個名爲project_static的目錄,該目錄應包含在各種應用程序(如jQuery)中通用的靜態文件。在Django中管理多個應用程序的靜態文件

我馬上碰到的問題是命名衝突。默認情況下,collectstatic只會將全部內容放在全局的static目錄下,而不會按應用程序對其進行分類。這對我不起作用,因爲每個應用程序都有 - 例如 - 一個名爲css/screen.css的文件。

我解決它是由STATICFILES_FINDERS去除django.contrib.staticfiles.finders.AppDirectoriesFinder和使用namespaced static files dirs的方式,所以我的設置,現在看起來像

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', 
) 

的問題是,這種方式我失去了靜態文件的所有其他應用,實例django.contrib.admin。當然,我可以手動添加管理員,但我不知道如何在不破壞具有不同目錄結構的管理員的情況下執行此操作。

有更好的方法來管理多個應用程序的靜態文件嗎?

回答

39

這與使用應用程序特定的templates目錄時發生的問題相同。如果您只是將文件直接放在應用程序中的templates下,那麼如果兩個應用程序甚至項目級別的目錄都使用相同名稱的模板,則最終會發生名稱衝突。造成這種情況的解決方法是居然把模板中的應用程序的名稱的目錄templates目錄中,如:

- some_app 
    - templates 
     - some_app 
      - index.html 

所以,我申請了同樣的想法,以靜:

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

這樣,當您運行collectstatic時,每個單獨的應用程序的靜態文件將被放置在名稱空間目錄中。您需要做的唯一更改是將每個文件與模板中的app-name目錄作爲前綴。所以,而不是{{ STATIC_URL }}css/style.css你有{{ STATIC_URL }}my_app/css/style.css

+0

如果我們使用nginx提供靜態文件,這仍然是首選方法嗎? (保持靜態文件,模板在應用程序本身) – Dineshkumar

+0

是的。您希望您的項目管理所有資產。 –

相關問題