2013-06-03 37 views
8

我想在構建django模板級別時有一些建議。Django模板繼承:多少級別和要呈現的頁面

閱讀文檔,我不明白如何創建超過2級的模板層次結構。

例如,我想創建3個級別的繼承:

base.html 
    └── base_level2.html 
      ├── level2_level3_1.html 
      └── level2_level3_2.html 

這是我的代碼:

  • base.html文件

    First level 
    {% block level2 %}{% endblock %} 
    
  • base_level2.html

    {% extends "base.html" %} 
    {% block level2 %} 
        Second level 
        {% block level3_1 %}{% endblock %} 
        {% block level3_2 %}{% endblock %} 
    {% endblock %} 
    
  • level2_level3_1.html

    {% extends "base_level2.html" %} 
    {% block level3_1 %} 
        Third level, part 1 
    {% endblock %} 
    
  • level2_level3_2.html

    {% extends "base_level2.html" %} 
    {% block level3_2 %} 
        Third level, part 2 
    {% endblock %} 
    
  • views.py:

    def myView(request): 
        return render_to_response('level2_level3_1.html', {}, context_instance=RequestContext(request)) 
    

這樣我可以看到以下我的瀏覽器:

First level 
Second level 
Third level, part 1 

這是合乎邏輯的我,因爲我只在level2_level3_1.html調用render_to response

當然,如果調用level2_level3_2.html,我會得到消息Third level, part 2而不是Third level, part1

如何解決這個問題?這是一個好方法嗎?我以這種方式構建了一些東西,因爲我的真實模板很大,有很多代碼行,所以我想保留一些命令。 任何意見將不勝感激。

+0

有什麼問題?你想有「第三級,第一部分」和「第三級,第二部分」。 爲什麼你不能把兩個部分放在同一個頁面?他們屬於兩個不同的塊。 – EsseTi

+0

正如我上面所說的「我以這種方式構建了一些東西,因爲我的真實模板非常大......」。這是一個簡單的例子,但我的level2_level3_1.html和level2_level3_2.html實際上很長,我不想將它們合併成一個巨大的單個文件。 – caneta

回答

6

很難說如果不知道模板的具體功能是好還是不好的想法,但是我的直接反應是您試圖過度組織模板。我想大多數人會敦促你遠離三層以上的系統,因爲這會讓網站變得更加困難,並且更難以跟蹤事情的發展。在Python的禪:

扁平比嵌套

更好

推薦爲Two Scoops of Django 3層體系是這樣的:

  1. 每個應用程序有一個base_<app_name>.html模板。應用程序級基本模板共享一個通用父級base.html。
  2. 應用程序內的模板共享一個共同的父母base_ <app_name>。html模板。
  3. 在同一水平base.html文件的任何模板繼承base.html文件

,併爲您的命名模式,它可能是這樣的:

| Templates/ 
    |--base.html 
    |--someothertemplate.html # extends base.html 
    |--level2/ 
    |----base_level2.html  # extends base.html 
    |----level2_1.html  # extends base_level2.html 
    |----level2_2.html  # extends base_level3.html 

編輯:並沒有真正的原因:

Second level 
    {% block level3_1 %}{% endblock %} 
    {% block level3_2 %}{% endblock %} 

其中每個塊指的是一個模板的內容。您可以簡化到一個塊像

{% block level3 %}{% endblock level3%} 

,然後在每個級別3的模板,因此重命名塊

+0

好吧,所以沒有辦法分裂level3,即使它是數千行的長度? – caneta

+0

你能解釋一下「分裂級別」是什麼意思嗎?這些級別是否顯示在同一頁面上?你只是試圖砍掉你的頁面,所以管理起來更容易? 如果你的模板長達數千行,你可能會做錯事。你應該編寫爲你生成html的代碼。 – skzryzg

+0

它不是「分層」,但是如何分割................ level3。是的,這些級別顯示在同一頁面上,如示例中所示。是的,我想砍掉我的頁面,因此管理起來更容易。我的模板長達數千行,因爲它非常龐大而複雜,不是因爲我不使用Django工具,模板標籤等等。 – caneta

3

也許沒有這樣做的最好的方式,但你可能用戶includehttps://docs.djangoproject.com/en/dev/ref/templates/builtins/#include

像這樣的​​

{% extends "base.html" %} 
{% block level2 %} 
Second level 
{% include "level2_level3_1.html" %} 
{% include "level2_level3_2.html" %} 
{% endblock %} 

我沒有測試這一點,所以不知道它的工作原理。

和BTW:

的包括標籤應被視爲「呈現此子模板,幷包括HTML」的實現,而不是「分析此子模板,包括它的內容,就好像它是部分父」。這意味着包含模板之間不存在共享狀態 - 每個包含都是完全獨立的呈現過程。

+0

是的,對於那個條款,我沒有使用include標籤。 – caneta

+0

但它應該做你所需要的,你甚至可以傳遞參數。 – EsseTi

+0

好的,我會試試看,謝謝! – caneta