2014-03-31 53 views
0

編輯擴展Django模板和壓倒一切的塊在循環

所以事實證明,下面的例子會工作,如果你的移動上方延伸的註釋標記標籤。根據Django docs:「如果在模板中使用{%extends%},它必須是該模板中的第一個模板標記,否則模板繼承將不起作用。」

原題:

我還是相當新的Django的,所以我做了一些谷歌搜索,但未能找到任何幫助。道歉,如果這是重複的!

方案

比方說,我有一個數字,共享相同的超類不同型號的,我要顯示所有共同領域的一個部分:

{% comment %} 
     Template: 
      _model_attribute_list.html 
     Args: 
      models: A collection of models that inherit from the same superclass 
    {% endcomment %} 

    {% for model in models %} 
     <ul> 
     <li>Common Attribute 1: {{ model.common_attribute_1 }}</li> 
     <li>Common Attribute 2: {{ model.common_attribute_2 }}</li> 
     <li>Common Attribute 3: {{ model.common_attribute_3 }}</li> 
     </ul> 
    {% endfor %} 

很容易的。現在我不僅要展示這些屬性,而且還要展示特定模型特有的屬性。而不是重複這部分N次,我想補充塊:

{% comment %} 
     Template: 
      _model_attribute_list.html (with blocks added) 
     Args: 
      models: A collection of models that inherit from the same superclass 
    {% endcomment %} 

    {% for model in models %} 
     <ul> 
     {% block leading_attributes %}{% endblock %} 
     <li>Common Attribute 1: {{ model.common_attribute_1 }}</li> 
     <li>Common Attribute 2: {{ model.common_attribute_2 }}</li> 
     <li>Common Attribute 3: {{ model.common_attribute_3 }}</li> 
     {% block trailing_attributes %}{% endblock %} 
     </ul> 
    {% endfor %} 

,並有其他型號的具體諧音覆蓋他們,使他們可以包括自定義字段:

{% comment %} 
     Template: 
      _model1_attribute_list.html 
     Args: 
      models: A collection of Model1 
    {% endcomment %} 
    {% extends '_model_attribute_list.html' %} 

    {% block leading_attributes %} 
     <li>Custom Attribute 1: {{ model.custom_attribute_1 }}</li> 
     <li>Custom Attribute 2: {{ model.custom_attribute_2 }}</li> 
    {% endblock %} 

按照Django docs ,當擴展模板時:

...模板引擎會注意到[父模板]中的...塊標籤,並用子模板的內容代替這些塊

鑑於文檔說什麼,爲什麼不工作?

我的假設是,當模板引擎呈現模板時,它會在評估循環之前插入塊,導致錯誤,因爲model.custom_aatribute_N的值尚不存在。

此外,我實際上沒有看到任何錯誤,但該模板未呈現。有沒有辦法讓Django在這種情況下吐出錯誤?

謝謝!

回答

1

我不確定爲什麼你當前的設置正常,但這裏有另一種方法可以嘗試。

  • 創建要
  • 按你的網頁
  • 在頁面創建專門的模板適當塊通用模板,而不是擴展模板,包括模板。

例如:

基。HTML

<ul> 
    {% block leading_attributes %}{% endblock %} 
    <li>Common Attribute 1: {{ model.common_attribute_1 }}</li> 
    <li>Common Attribute 2: {{ model.common_attribute_2 }}</li> 
    <li>Common Attribute 3: {{ model.common_attribute_3 }}</li> 
    {% block trailing_attributes %}{% endblock %} 
    </ul> 

special1.html

{%extends "base.html" %} 
{% block leading_attributes %} 
    <li>Custom Attribute 1: {{ model.custom_attribute_1 }}</li> 
    <li>Custom Attribute 2: {{ model.custom_attribute_2 }}</li> 
{% endblock %} 

your_page.html

{% for model in models %} 
    {%include "special1.html" %} 
{%endfor%} 
+0

我想通了,而且事實證明我的例子會工作...如果我移動的 「擴展」在評論前標記。男孩我感到愚蠢!無論如何,我會把你標記爲正確的答案,因爲你花時間幫助我。謝謝你的幫助! – Steve