訂購

2014-01-09 148 views
2

比如我有2個應用程序在我的Django項目使用模板和靜態文件具有相同的子路徑:訂購

app1/
    static/
     style.css 
    templates/
     index.html 
app2/
    static/
     style.css 
    templates/
     index.html 

比,settings.py中我加了這個兩應用程序:

INSTALLED_APPS = (
    'app1', 
    'app2', 
) 

現在我以某種方式在模板中使用'style.css'和'index.html',例如

{% include 'index.html' %} 

所以,問題是:

不Django的保證,當我提到「style.css文件」或「的index.html」將從APP 2子目錄使用的文件?

是否有任何其他方式指出在這種情況下Django文件的優選變體?

回答

5

按文檔,第一場比賽勝:

重複的文件名,默認情況下以類似的方式解決, 模板的分辨率是如何工作的:即先在 指定的位置之一找到該文件將使用。

https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#django-admin-collectstatic

現在,當你告訴Django收集靜態文件或呈現模板,Django的要求,以特殊的「發現者」他們是在你的configuraiton指定資源定義。

靜態文件的默認順序是「FileSystemFinder」,它搜索STATICFILES_DIRS以便將它們添加到文件中。如果FileSystemFinder無法在這些目錄中找到文件,Django會使用下一個查找器集合,即「AppDirectoriesFinder」,它將在應用程序目錄中的「靜態」子目錄中進行搜索。

相同的機制應用於模板。當您告訴Django呈現「index.html」時,首先會在TEMPLATE_DIRS中定義的目錄中詢問「filesystem.Loader」查找模板。如果搜索失敗,Django會詢問下一個模板加載器「app_directories.Loader」,它在應用程序「模板」子目錄中搜索模板目錄。

要回答你的問題,因爲app1是在app2之前註冊的,Django將使用它的style.css和index.html,而不是來自app2的。如果您想更改此行爲,請在安裝的應用設置中將app2放在app1上方。

文檔: https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.loaders.app_directories.Loader

+0

謝謝你,Ralfp。我懷疑Django的開發服務器(runserver)以與collectstatic命令相同的方式提供靜態文件。看起來像在某些未定義的行爲中發現的靜態文件。我將嘗試將runserver的行爲與collectstatic的行爲進行比較。 – Aleksey