2014-12-04 53 views
0

在Django的教程,它建議應用程序的模板爲什麼我們建議將模板放在project/app_name/templates/app_name /?

project/app_name/templates/app_name

導致他們去從觀點的東西被稱爲像這樣:

class ScenarioDetails(generic.DetailView): 
    model = Scenario 
    template_name= "cmmods/scenario.html" 

我想明白了什麼落後於這一建議。

我看不出有什麼情況會使它不好把模板

project/app_name/templates

,並指他們正是如此:

class ScenarioDetails(generic.DetailView): 
    model = Scenario 
    template_name= "scenario.html" 

這是什麼建議的背後?

回答

2

它避免了名稱衝突,它明確指向模板所在的應用程序。

說你的應用定義了幾個非常相似的模板。實現這一點的簡單方法是使用基本模板,例如'base.html'。這是一個相當普遍的名稱,很可能其他應用程序使用相同的名稱。如果您將此模板放入根模板文件夾中,則名稱衝突和兩個應用程序都會獲得相同的模板,具體取決於您的INSTALLED_APPS中哪一個先到達(或最後一個)。

通過將每個模板放在以應用程序命名的文件夾中,可以避免這些名稱衝突。從模板名稱查找模板也更容易,如果您的應用使用其他應用的模板,這非常有用。

假設您在您的app2應用中使用模板detail.html。 Django將按照發現的順序在全部模板文件夾中查找此模板。現在,你安裝的應用程序是這樣的:

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

Django會查找detail.html文件在以下位置,並挑選它找到的第一個:

/path/to/project/app1/templates/detail.html 
/path/to/project/app2/templates/detail.html 

即使app2預計該模板文件在app2/templates/中,Django將在app1/templates/中給出模板(如果存在)。你得到錯誤的模板,因爲(相對)名稱是相同的。

現在,如果您要將您的模板放入app2/templates/app2/detail.html,則確定您獲得了正確的模板。

+0

感謝您的回答,對不起我不太關注。你是說我不能在每個應用程序的'app_name/template /'文件夾中安全地擁有不同的base.html?我_think_(儘管我必須去搜索),我回想起的那個教程確實提示base.html(僅)會出現在應用程序的根模板文件夾中! – GreenAsJade 2014-12-04 10:55:18

+0

@GreenAsJade好吧,這可能是一個令人困惑的例子,因爲許多網站在根文件夾中有一個'base.html'模板,它定義了網站中_every_ html頁面的基本結構。由於這是一個項目範圍的模板(而不是特定於應用程序),它應該確實位於根模板文件夾中。但是,假設你的應用中有模型的'detail.html'。如果它駐留在模板文件夾的根目錄下,而另一個應用程序爲另一個模型定義了同樣的'detail.html',則模板查找程序將只能找到其中一個模板,其中一個應用程序最終會使用錯誤的模板。 – knbk 2014-12-04 10:58:40

+0

所以我認爲你所說的是即使視圖是「在」一個特定的應用程序,但模板查找器不能利用這個來確定選擇哪個模板?它不能說「這個視圖在app1中,所以我將使用'app1/templates/detail.html'」 – GreenAsJade 2014-12-04 11:00:16

1

原因是模板需要與其他Django應用程序的模板分開以防止衝突。這就是爲什麼Django應用程序中的所有模板都應保存在名爲app_name/templates/app_name的目錄中。

例如,如果沒有這樣做,如果兩個具有相同模板(相同文件名)的應用程序在同一個Django項目中一起使用時會出現問題(沒有額外的工作,Django不知道這些中的哪一個)home.html文件中使用):

app1/templates/home.html 
app2/templates/home.html 

由於公約的結果,包括在模板中的路徑中的應用程序的名稱,你可以安全地創建和發佈一個Django應用程序,然後重新使用在其他的Django項目,而不必擔心會有文件名問題。

+0

這不完全正確:collectstatic不收集模板文件,只收集靜態文件(css,js等)。但是,相同的相對名稱會導致名稱衝突。 – knbk 2014-12-04 10:55:04

+0

名稱最終衝突的地方在哪裏?假設每個應用程序的base.html都在自己的模板文件夾中,那麼它是什麼不能分辨哪個base.html(例如)應該用於每個應用程序? – GreenAsJade 2014-12-04 10:56:33

+0

@knbk:謝謝你提醒我的記憶,我已經更新了答案。 – 2014-12-04 11:01:19

相關問題