Django從理論到實戰(part19)--DTL模板語法

學習筆記,僅供參考

參考自:Django打造大型企業官網–Huang Y;官方文檔

本系列Blog以應用爲主,理論基礎部分我在後端專欄Django系列博客已經寫過了,如果有些需要補充的知識點,我會在這個系列中,儘量詳細的記錄一下。




DTL模板語法


變量


模板中可以包含變量,Django在渲染模板的時候,可以傳遞變量對應的值過去進行替換。變量的命名規範和Python非常類似,只能是阿拉伯數字和英文字符以及下劃線的組合,不能出現標點符號等特殊字符,例如:

{# profile.html模板代碼 #}
<p>{{ username }}</p>

模板中的變量同樣也支持點.的形式,比如person.username,模板是按照以下方式進行解析的:

  • 如果person是一個字典,那麼就會查找這個字典的username這個key對應的值。

  • 如果person是一個對象,那麼就會查找這個對象的username屬性,或者是username這個方法。

  • 如果出現的是person.0,則Django會判斷persons是否是一個列表或者元組或者任意的可以通過下標訪問的對象,如果是的話就取這個列表的第1個值,如果不是,獲取到的就是一個空的字符串。


常用標籤


if標籤


if標籤相當於Python中的if語句,有elifelse相對應,但是所有的標籤都需要用標籤符號({%%})進行包裹。if標籤中可以使用==、!=、<、<=、>、>=、in、not in、is、is not等判斷運算符,例如:

 {% if "張三" in persons %}
     <p>張三</p>
 {% else %}
     <p>李四</p>
 {% endif %}

for...in...標籤


for...in...標籤類似於Python中的for...in...。可以遍歷列表、元組、字符串、字典等一切可以遍歷的對象,例如:

 {% for person in persons %}
     <p>{{ person.name }}</p>
 {% endfor %}

如果想要反向遍歷,那麼在遍歷的時候就加上一個reversed,例如:

 {% for person in persons reversed %}
     <p>{{ person.name }}</p>
 {% endfor %}

在python中,需要使用itemskeysvalues等方法遍歷字典,在DTL中,執行上述方法的語法如下:

 {% for key,value in person.items %}
     <p>key:{{ key }}</p>
     <p>value:{{ value }}</p>
 {% endfor %}

for循環中,DTL提供了一些變量供我們使用,詳見下表:


變量 解釋
forloop.counter 當前循環的下標,以1作爲起始值
forloop.counter0 當前循環的下標,以0作爲起始值
forloop.revcounter0 類似於forloop.revcounter,不同的是最後一個元素的下標是從0開始
forloop.revcounter 當前循環的反向下標值,比如列表有5個元素,那麼第一次遍歷這個屬性是等於5,第二次是4,以此類推。並且是以1作爲最後一個元素的下標
forloop.first 是否是第一次遍歷
forloop.last 是否是最後一次遍歷
forloop.parentloop 如果有多個循環嵌套,那麼這個屬性代表的是上一級的for循環

for...in...empty標籤


該標籤使用跟for...in...是一樣的,只不過是在遍歷的對象如果沒有元素的情況下,會執行empty中的內容,例如:

 {% for person in persons %}
     <li>{{ person }}</li>
 {% empty %}
     無元素
 {% endfor %}

with標籤


該標籤可以幫助我們在模版中定義變量。有時候一個變量的訪問比較複雜,那麼可以先把這個變量緩存到另一個變量上,之後就可以直接使用這個變量了,例如:

#視圖模塊中
context = {
     "persons": ["小黃","大白"]
 }

#模板文件中
 {% with lisi=persons.1 %}
     <p>{{ lisi }}</p>
 {% endwith %}

還有另外一種寫法:

{% with persons.1 as lisi %}
    <p>{{ lisi }}</p>
{% endwith %}

需要注意的是:

  • with語句中定義的變量,只能在{%with%}{%endwith%}中使用,不能在這個標籤外面使用;
  • 定義變量的時候,不能在等號左右兩邊留有空格,比如,{% with lisi = persons.1%}是錯誤的。

url標籤


在模版中,我們經常要寫一些url,比如在a標籤中定義href屬性,如果我們通過硬編碼的方式直接將這個url寫死也是可以的,但是這樣對於以後項目維護可能不是一件好事,因此建議使用反轉的方式來實現,類似於django中的reverse一樣,例如:

<a href="{% url 'book:list' %}">圖書列表頁面</a>

如果url反轉的時候需要傳遞參數,那麼可以通過位置參數和關鍵字參數兩種方式,注意位置參數和關鍵字參數不能同時使用,例如:

#urls.py模塊中
 path('detail/<book_id>/',views.book_detail,name='detail')

#模板文件中
#url反轉,使用位置參數
<a href="{% url 'book:detail' 1 %}">圖書詳情頁面</a>

#url反轉,使用關鍵字參數
<a href="{% url 'book:detail' book_id=1 %}">圖書詳情頁面</a>

如果需要傳遞多個參數,那麼通過空格的方式進行分隔,例如:

<a href="{% url 'book:detail' book_id=1 page=2 %}">圖書詳情頁面</a>

如果想要在url標籤反轉時傳遞查詢字符串的參數,那麼必須要手動在在後面添加,例如:

<a href="{% url 'book:detail' book_id=1 %}?page=1">圖書詳情頁面</a>

spaceless標籤


該標籤用於移除html標籤中的空白字符,包括空格、tab鍵、換行等,例如:

 {% spaceless %}
     <p>
         <a href="foo/">Foo</a>
     </p>
 {% endspaceless %}

渲染完成後,頁面中的代碼會變成下面這樣:

<p><a href="foo/">Foo</a></p>

spaceless只會移除html標籤之間的空白字符,而不會移除標籤與文本之間的空白字符,例子:

{% spaceless %}
    <strong>
        Hello
    </strong>
{% endspaceless %}

上述代碼將不會移除strong標籤中的空白字符。


autoescape標籤


該標籤可以開啓和關閉這個標籤內元素的自動轉義功能,自動轉義可以將一些特殊的字符,比如<轉義成html語法能識別的字符,比如<會被轉義成<,而>會被自動轉義成>,模板中默認是已經開啓了自動轉義的,例如:

#傳遞的上下文信息
 context = {
     "info":"<a href='www.baidu.com'>百度</a>"
 }

 #模板中關閉自動轉義
 {% autoescape on %}
     {{ info }}
 {% endautoescape %}

上述代碼中,會顯示百度的一個超鏈接,但是如果開啓自動轉義(off),那麼就會顯示成一個普通的字符串。


verbatim標籤


DTL模板中,默認會解析一些特殊字符,比如,{%%}以及{{等。如果我們在某個代碼片段中不想使用DTL的解析引擎,那麼可以把這個代碼片段放在verbatim標籤中,例如:

 {% verbatim %}
     {{if dying}}Still alive.{{/if}}
 {% endverbatim %}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章