學習筆記,僅供參考
參考自: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
語句,有elif
和else
相對應,但是所有的標籤都需要用標籤符號({%%}
)進行包裹。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中,需要使用items
、keys
和values
等方法遍歷字典,在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 %}