2012-02-08 113 views
4

我在settings.INSTALLED_APPS兩種應用:Django的:擴展覆蓋的模板

INSTALLED_APPS = [ 
    'application2', 
    'application1' 
] 

,並希望應用2從應用程序1更改模板(例如,通過添加按鈕)。

如何在不覆蓋整個模板的情況下實現這一目標?

注意

的問題是,兩個模板具有相同的名稱( 「mytemplate.html」)和相同的文件夾名稱( 「應用程序1」):

\project_root 
    \application1\templates\application1\mytemplate.html 
    \application2\templates\application1\mytemplate.html 

讓我無法寫入:

{% extends "application1\mytemplate.html" %} 

因爲兩個模板都被命名爲「application1 \ mytemplate.html」。

回答

1

模板是不是真的由應用程序擁有。如果你願意的話,它們可以分組到應用程序目錄中,但幾乎與它們無關。

無論應用程序提供了什麼,覆蓋部分模板的方法是使用{% extends 'template_name.html' %}從它繼承,然後定義您需要覆蓋的任何塊。當然,這意味着父模板需要定義已經定義的模塊 - 否則您需要覆蓋已定義的最小相關模塊,然後在需要更改的位周圍重複一些內容。

+1

問題是這兩個模板具有相同的名稱。我已將這個註釋添加到問題中。 – Don 2012-02-08 11:32:40

+1

那麼不要將它們命名爲相同?反正不行。 Django將*總是*拉取它找到的第一個具有指定名稱的模板,因此INSTALLED_APPS中較低應用程序的模板將永遠不會被使用。 – 2012-02-08 15:36:53

+1

+1「模板是不是真的由應用程序擁有」 – Don 2012-05-02 08:28:20

2

我認爲這不適用於您描述的情況,因爲這意味着INSTALLED_APPS順序很重要。由於這是stated in the django book

INSTALLED_APPS的順序並不重要,但我們喜歡讓事情按字母順序排列,因此很容易對人類閱讀。

據我所知,這不是官方文件。然而,這本書是由Adrian Holovaty和Jacob Kaplan-Moss(Django的創造者)撰寫的,所以我會對此表示贊同。

但是,如果您對此有所瞭解,您會明白爲什麼訂購不是一個好主意: 它只對特定情況有幫助 - 簡單的情況。在稍微複雜的情況下,這無濟於事。例如: -

  • 你有app1app2app3
  • app2app3擴展/超控模板app1/a.htmlapp1/b.html
  • 您想要使用a.html,如app2b.html中定義的,如app3中所定義。
+0

有Django應用程序(如Django的格拉佩利:http://readthedocs.org/docs/django-grappelli/en/latest/quickstart.html#setup),這要在其他應用程序之前插入到INSTALLED_APPS中,以便它們可以覆蓋默認行爲。 – Don 2012-05-02 08:34:25

+2

我知道依賴於INSTALLED_APPS命令的應用程序確實存在。但他們絕對是角落案例。例如。 django-grappeli對django管理界面進行了重大修改。從功能角度來看,django-grappeli更像是一個django mod而不是django應用程序。 依靠INSTALLED_APPS命令絕對不是您的日常應用程序的良好Django實踐。 – m000 2012-05-03 09:59:41