2016-12-10 59 views
-2

如果您閱讀例如該Django tutorial它會向你解釋,你應該把模板爲「調查程序」到一個文件夾,如下所示:Django模板的怪異命名空間 - 爲什麼?

polls/templates/polls/index.html 

在這裏,文件夾「民意調查」是應用程序文件夾,它位於「myproject的內'文件夾。

他們特別提到以下幾點:

模板命名空間

現在我們也許可以用把我們的模板直接 在民意測驗/模板(而不是創造另一個民調子目錄)脫身, 但它實際上是一個壞主意。 Django會選擇第一個找到其名稱匹配的 模板,如果您在不同的應用程序中使用了同名的 模板,Django將無法區分它們。我們需要能夠將Django指向 正確的一個,最簡單的方法是通過命名空間來確保它。 也就是說,將這些模板放在另一個以 命名的目錄中。

對我來說,這似乎是在實現Django模板中的一個錯誤。具體來說,模板加載器似乎有意無視信息,即從路徑./polls/templates中獲得的「民意調查」。

我的問題是:

至於我可以告訴一個可能做了模板加載器,使其從app目錄採集到的應用程序名稱。那麼就不需要在app目錄中的templates文件夾內創建另一個名爲app的目錄。

我錯過了什麼嗎?爲什麼需要引入 模板文件夾中的文件夾?

回答

0

所有的模板源都有相同的名稱空間。這看起來可能很奇怪,但這可以讓你爲其他應用程序定義或覆蓋模板。否則,將無法爲django.contrib.auth定義所需的模板,並且您將無法覆蓋默認管理模板。

那麼爲什麼我們在第一個地方有單獨的模板文件夾?

因爲模板來自不同的來源。有些與Django捆綁在一起,有些來自第三方應用程序,有些則由您在項目中定義。使用單個模板文件夾需要複製從Django和第三方應用程序中需要的任何模板。

考慮到這一點,templates/polls/目錄只是一個約定,以避免名稱衝突的模板,而不是覆蓋其他模板。

已經有一些第三方應用程序實現您描述的行爲,但據我所知他們從來沒有發現過。它們僅僅限制了模板系統的功能,收益很少。