Django从理论到实战(part19)--DTL模板语法
學習筆記,僅供參考
參考自:Django打造大型企業官網–Huang Y;官方文檔
本系列Blog以應用為主,理論基礎部分我在后端專欄的Django系列博客已經寫過了,如果有些需要補充的知識點,我會在這個系列中,盡量詳細的記錄一下。
文章目錄
- DTL模板語法
- 變量
- 常用標簽
- `if`標簽
- `for...in...`標簽
- `for...in...empty`標簽
- `with`標簽
- `url`標簽
- `spaceless`標簽
- `autoescape`標簽
- `verbatim`標簽
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 %}總結
以上是生活随笔為你收集整理的Django从理论到实战(part19)--DTL模板语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django从理论到实战(part18)
- 下一篇: 怎么在Flash cs3中将位图转换为矢