2010-04-19 26 views
1

有人可以幫我找出一種方法在Django模板中實現以下內容(請參閱下面的代碼片段)嗎?我知道你不能使用多個擴展,但我對django是新手,我不知道這樣的正確語法。我希望能夠做到這一點,以便我可以使用我的嵌套的div佈局出於css原因,而不必每次都鍵入它,並冒着打字錯誤的風險。換言之,我希望能夠有一個頁面模板來擴展我的base.html文件,然後使用動態模板內容的html片段(即模板用於循環或其他模板邏輯設備,而不僅僅是我從視圖控制器中設置的上下文變量)。如何在擴展另一個文件的django模板中使用帶有動態內容的html塊代碼片段?


編輯: 我希望能夠以任意方式在各列中顯示任意內容。例如,我希望能夠在一列中顯示ul圖像,然後在同一頁上顯示另一組顯示數據表的列。下面是我輸入了一個例子: example of alot of random columns


我意識到,例如畫面有從Django的網絡測試儀輸出產生的所有文字,但每個coulmn應該能夠有任意內容。它們應該是可嵌套的。這可能與默認的Django模板語言?

------------------------------------------------------------ 
base.html 
------------------------------------------------------------ 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
     <title>{% block title %}Title{% endblock %}</title> 
    </head> 
    <body> 
     <div class="wrapper"> 
      <div class="header"> 
       This is the common header 
      </div> 
      <div class="nav"> 
       This is the common nav    
      </div> 
      {% if messages %} 
       <div class="messages"> 
        <ul> 
         {% for message in messages %} 
         <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li> 
         {% endfor %} 
        </ul> 
       </div> 
      {% endif %} 
      <div class="content"> 
       {% block content %}Page Content{% endblock %} 
      </div> 
      <div class="footer"> 
       This is the common footer 
      </div> 
     </div> 
    </body> 
</html> 
------------------------------------------------------------ 
columnlayout2.html 
------------------------------------------------------------ 
<div class="twocol container2"> 
    <div class="container1"> 
     <div class="col1"> 
      {% block twocol_col1 %}{% endblock %} 
     </div> 
     <div class="col2"> 
      {% block twocol_col2 %}{% endblock %} 
     </div> 
    </div> 
</div> 

------------------------------------------------------------ 
columnlayout3.html 
------------------------------------------------------------ 
<div class="threecol container3"> 
    <div class="container2"> 
     <div class="container1"> 
      <div class="col1"> 
       {% block threecol_col1 %}{% endblock %} 
      </div> 
      <div class="col2"> 
       {% block threecol_col2 %}{% endblock %} 
      </div> 
      <div class="col3"> 
       {% block threecol_col3 %}{% endblock %} 
      </div> 
     </div> 
    </div> 
</div> 

------------------------------------------------------------ 
page.html 
------------------------------------------------------------ 
{% extends "base.html" %} 

{% block content %} 

    {% extends "columnlayout2.html" %} 
     {% block twocol_col1 %}twocolumn column 1{% endblock %} 
     {% block twocol_col2 %}twocolumn column 2{% endblock %} 

    {% extends "columnlayout3.html" %} 
     {% block threecol_col1 %}threecol column 1{% endblock %} 
     {% block threecol_col2 %}threecol column 2{% endblock %} 
     {% block threecol_col3 %}threecol column 3{% endblock %} 

{% endblock %} 

------------------------------------------------------------ 
page.html output 
------------------------------------------------------------ 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
     <title>Title</title> 
    </head> 
    <body> 
     <div class="wrapper"> 
      <div class="header"> 
       This is the common header 
      </div> 
      <div class="nav"> 
       This is the common nav    
      </div> 
      <div class="content"> 
       <div class="twocol container2"> 
        <div class="container1"> 
         <div class="col1"> 
          twocolumn column 1 
         </div> 
         <div class="col2"> 
          twocolumn column 2 
         </div> 
        </div> 
       </div> 
       <div class="threecol container3"> 
        <div class="container2"> 
         <div class="container1"> 
          <div class="col1"> 
           threecol column 1 
          </div> 
          <div class="col2"> 
           threecol column 2 
          </div> 
          <div class="col3"> 
           threecol column 3 
          </div> 
         </div> 
        </div> 
       </div> 
      </div> 
      <div class="footer"> 
       This is the common footer 
      </div> 
     </div> 
    </body> 
</html> 
+0

聽起來像[包含標籤](http://docs.djangoproject.com/en/1.1/howto/custom-template-tags/#inclusion-tags)是你所追求的。 – 2010-04-19 21:42:47

回答

1

我與丹尼爾同意,包含標籤可能是你以後在做什麼,我想你是誤會他們{% extends %}

如果你的內容是靜態的,或在上下文中,可以使用{%包含%}塊像

{% block content %} 
    {% include "columnlayout2.html" %} 
    {% include "columnlayout3.html" %} 
{% endblock %} 

,這樣可以存儲你像{{two_columns}}和{{想要的內容three_columns}}和渲染

------------------------------------------------------------ 
columnlayout2.html 
------------------------------------------------------------ 
<div class="twocol container2"> 
    <div class="container1"> 
     <div class="col1"> 
      {{ two_columns[0] }} 
     </div> 
     <div class="col2"> 
      {{ two_columns[1] }} 
     </div> 
    </div> 
</div> 

或者你可以使用裏面page.html中包含標籤

編輯

主持人需要在不同的頁面上使用不同的結構(而不​​僅僅是內容)呈現HTML,因此您可以執行諸如「嵌套」包含標記調用等操作。

{% block content %} 
    {% show_two_columns two_columns %} 
    {% show_three_columns three_columns %} 
{% endblock %} 

templatetag

@register.inclusion_tag("columns/two_columns.html") 
def show_two_columns(columns): 
    return {'columns': columns} 

two_columns.html

<div class="twocol container2"> 
    <div class="container1"> 
     <div class="col1"> 
      {% render_column columns[0] %} 
     </div> 
     <div class="col2"> 
      {% render_column columns[1] %} 
     </div> 
    </div> 
</div> 

,然後你可以做你需要改變你想在render_column包含標籤和模板它來展示一下什麼邏輯使用。我希望我能說更多,但是對於列內容的依賴性以及它們在每種情況下的差異都非常具體。

+0

好的。我將其標記爲答案。你如何操作你通過page.html中的包含過濾器傳遞的列表/查詢集/數據?我希望能夠在幾個不同的頁面模板中使用列片段,因此通過包含過濾器傳遞的數據已經需要格式化爲html。 – user319862 2010-04-20 12:28:50

+0

啊我明白了。確實,你不想在你的視圖中構建任何HTML。 HTML每次都完全不同嗎? – 2010-04-21 17:44:37

+0

是的,這是...... = /這就是讓我頭痛的原因。 – user319862 2010-04-21 23:26:52

相關問題