控制自動轉義是否可用. 這種標籤帶有任何 on
或 off
做爲參數的話,他將決定轉義塊內效果。 該標籤會以一個endautoescape
做爲結束標籤.html
當自動轉義生效時,全部變量內容會被轉義成HTML輸出(在全部過濾器生效後) 這等同與手動將escape
篩選器應用於每一個變量。python
實例:數據庫
1)django
<!-- index.html文件 -->
<body>
<p>{{ text }}</p>
{% autoescape off %}
{{ text }}
{% endautoescape %}
</body>
若是: text = "<b>文本內容</b>"瀏覽器
頁面顯示結果:緩存
<b>文本內容</b>服務器
文本內容app
2)less
<!-- index.html文件 -->
<body>
<p>{{ text }}</p>
{% autoescape off %}
{{ text|escape }}
{% endautoescape %}
</body>
頁面顯示結果:ide
<b>文本內容</b>
<b>文本內容</b>
使用了escape過濾器, 則對text文本轉義
(1) safe 通常做用於單行文本
(2) autoescape off 通常做用於塊級內容
實例:
1)
<body>
<p>{{ text }}</p>
{% autoescape on %}
{{ text }}
{% endautoescape %}
</body>
頁面顯示結果:
<b>文本內容</b>
<b>文本內容</b>
2)
<body>
<p>{{ text|safe }}</p>
{% autoescape off %}
{{ text }}
{{ text|escape }}
{% endautoescape %}
</body>
頁面顯示結果:
文本內容
文本內容
通常在父模板可使用block標籤, 把變化的內容能夠包裹在block標籤內; 子模板引用父模板後, 可使用block標籤重寫內容, 覆蓋父模板中原來的內容.
實例:
<!-- 父模板html -->
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>年度頁面</title>
</head>
<body>
<div>
<p>這是年度新聞</p>
</div>
{% block content %}
<p>頁面主體內容</p>
{% endblock content %}
</body>
</html>
<!-- 子模板一 html -->
{% extends 'show_year.html' %}
<!-- 子模板二 html -->
{% extends 'show_year.html' %}
{% block content %}
<p>子模板中內容</p>
{% endblock %}
子模板的顯示結果:
子模板一:
這是年度新聞
頁面主題內容
子模板二:
這是年度新聞
子模板中內容
在 {% comment %}
和 {% endcomment %}
,之間的內容會被忽略,做爲註釋。至關於多行註釋
示例:
{% comment %}
<b>粗體</b>
<div>
<p>這是Index頁面</p>
</div>
{% endcomment %}
這部分註釋的內容, 在服務器端就直接忽略到了, 不會發送給客戶端.
這個標籤用於跨站請求僞造保護.
客戶端在提交表單到服務端時, 若是表單中不寫這個標籤, 服務端會直接返回403 Forbidden
的錯誤. 把這個標籤寫到表單中, 能夠避免發生這個錯誤.
當把csrf_token寫到表單中後, 其實客戶端在提交數據時, 會提交一個name=csrfmiddlewaretoken
, value
爲隨機的64位字符給服務端, 服務端收到後, 會根據這串字符校驗客戶端的合法性.(若是想看這個csrfmiddlewaretoken的具體內容,能夠打開瀏覽器的調試控制檯; 你會看到一個屬性type='hidden'的input標籤, value
已經有默認值).
表單
<form action="" method="POST">
{% csrf_token %}
<input type="text" name="name" placeholder="姓名">
<button type="submit">提交</button>
</form>
每當這個標籤被訪問,則傳出一個它的可迭代參數的元素。 第一次訪問返回第一個元素,第二次訪問返回第二個參數,以此類推. 一旦全部的變量都被訪問過了,就會回到最開始的地方,重複下去
實例:
1) 這個標籤在循環中特別有用:
{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}
第一次迭代產生的HTML引用了
row1
類,第二次則是row2
類,第三次 又是row1
類,如此類推。2) 你也可使用變量, 例如,若是你有兩個模版變量,
rowvalue1
和rowvalue2
, 你可讓他們的值像這樣替換:{% for o in some_list %}
<tr class="{% cycle rowvalue1 rowvalue2 %}">
...
</tr>
{% endfor %}
被包含在cycle中的變量將會被轉義。 你能夠禁止自動轉義:
{% for o in some_list %}
<tr class="{% autoescape off %}{% cycle rowvalue1 rowvalue2 %}{% endautoescape %}">
...
</tr>
{% endfor %}
你能混合使用變量和字符串:
{% for o in some_list %}
<tr class="{% cycle 'row1' rowvalue2 'row3' %}">
...
</tr>
{% endfor %}
輸出整個調試信息,包括當前上下文和導入的模塊。
表示當前模板繼承自一個父模板
這個標籤能夠有兩種用法:
{% extends "base.html" %}
(要有引號).繼承名爲"base.html"
的父模板{% extends 變量 %}
使用variable
若是變量被計算成一個字符串,Django將會把它當作是父模版的名字。 若是變量被計算到一個Template
對象,Django將會使用那個對象做爲一個父模版。一般模板名稱是相對於模板加載器的根目錄。 字符串參數也能夠是以./
或../
開頭的相對路徑。 例如,假設如下目錄結構:
dir1/
template.html
base2.html
my/
base3.html
base1.html
在template.html
中,如下路徑將有效:
{% extends "./base2.html" %}
{% extends "../base1.html" %}
{% extends "./my/base3.html" %}
經過一個或多個過濾器對內容過濾。 做爲靈活可變的語法,多個過濾器被管道符號相鏈接,且過濾器能夠有參數。
注意塊中全部的內容都應該包括在endfilter
和filter
標籤中。
注: escape
和safe
過濾器不是可接受的參數。 而應使用autoescape
標記來管理模板代碼塊的自動轉義。
實例:
{% filter force_escape|lower %}
This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}
{% autoescape off %}
{% filter force_escape|lower %}
This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}
{% endautoescape %}
輸出第一個不爲False
參數。 若是傳入的全部變量都爲False
,就什麼也不輸出。
例如:
{% firstof var1 var2 var3 %}
它等價於:
{% if var1 %}
{{ var1 }}
{% elif var2 %}
{{ var2 }}
{% elif var3 %}
{{ var3 }}
{% endif %}
固然你也能夠用一個默認字符串做爲輸出以防傳入的全部變量都是False:
{% firstof var1 var2 var3 "default value" %}
循環組中的每個項目,並讓這些項目在上下文可用。 舉個例子,展現athlete_list
中的每一個成員:
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
能夠利用{% for obj in list reversed %}
反向完成循環。
若是你須要循環一個包含列表的列表,能夠經過拆分每個二級列表爲一個獨立變量來達到目的。 舉個例子,若是你的內容包括一個叫作points
的(x,y) 列表,你能夠像如下例子同樣輸出points列表:
{% for x, y in points %}
There is a point at {{ x }},{{ y }}
{% endfor %}
若是你想訪問一個字典中的項目,這個方法一樣有用。 舉個例子:若是你的內容包含一個叫作data
的字典,下面的方式能夠輸出這個字典的鍵和值:
{% for key, value in data.items %}
{{ key }}: {{ value }}
{% endfor %}
請記住,對於點運算符,字典鍵查找優先於方法查找。若是要在模板中使用這些方法(items
,values
,keys
等),請避免添加名爲字典方法的鍵。
for循環可用的參數:
變量 | 描述 |
---|---|
forloop.counter |
當前循環的索引值(索引從1開始) |
forloop.counter0 |
當前循環的索引值(索引從0開始) |
forloop.revcounter |
當前循環的倒序索引值(索引從1開始) |
forloop.revcounter0 |
當前循環的倒序索引值(索引從0開始) |
forloop.first |
若是這是第一次循環,返回True |
forloop.last |
若是這是最後一次循環,則爲True |
forloop.parentloop |
對於嵌套循環,這是當前循環的外層循環 |
for
標籤帶有一個可選的{% empty %}
從句,以便在給出的組是空的或者沒有被找到時,能夠有所操做。
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% empty %}
<li>Sorry, no athletes in this list.</li>
{% endfor %}
</ul>
它和下面的例子做用相等,可是更簡潔、更清晰甚至可能運行起來更快:
<ul>
{% if athlete_list %}
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
{% else %}
<li>Sorry, no athletes in this list.</li>
{% endif %}
</ul>
{% if %}
會對一個變量求值,若是它的值是「True」(存在、不爲空、且不是boolean類型的false值),這個內容塊會輸出:
{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
Athletes should be out of the locker room soon!
{% else %}
No athletes.
{% endif %}
上述例子中,若是athlete_list
不爲空,就會經過使用{{ athlete_list|length }}
過濾器展現出athletes的數量。
正如你所見,if
標籤以後能夠帶有一個或者多個{% elif %}
從句,也能夠帶有一個{% else %}
從句以便在以前的全部條件不成立的狀況下完成執行。 這些從句都是可選的。
if
標籤可使用not
,and
或or
來測試多個變量的布爾值.
加載模板並以標籤內的參數渲染。 這是一種能夠引入別的模板的方法。
模板名能夠是變量或者是硬編碼的字符串,能夠用單引號也能夠是雙引號.
下面這個示例包括模板"foo/bar.html"
的內容:
{% include "foo/bar.html" %}
一般模板名稱是相對於模板加載器的根目錄。 字符串參數也能夠是以./
或../
開頭的相對路徑,如extends
標籤中所述。
加載自定義模板標籤集。
舉個例子, 下面這模板將會從package
包中載入全部otherlibrary
和somelibrary
中已經註冊的標籤和過濾器:
{% load somelibrary package.otherlibrary %}
你還可使用from
參數從庫中選擇性加載單個過濾器或標記。 在下面這個示例中,名爲somelibrary
和bar
的模板標籤/過濾器將從foo
加載:
{% load foo bar from somelibrary %}
顯示最近的日期或事件,能夠經過給定的字符串格式顯示。
實例:
{% now 'Y-m-d H:i:s' %}
輸出相似:
2018-10-11 07:05:40
您也可使用語法{% now 「Y」 as current_year %}
將輸出(做爲字符串)存儲在變量中。 This is useful if you want to use {% now %}
inside a template tag like blocktrans
for example:
{% now "Y" as current_year %}
{% blocktrans %}Copyright {{ current_year }}{% endblocktrans %}
<!-- 使用blocktrans標籤須要在html文件頭部加上 {% load i18n %}, 導入已有的i18n模板-->
用類似對象間共有的屬性重組列表.
This complex tag is best illustrated by way of an example: say that cities
is a list of cities represented by dictionaries containing "name"
,"population"
, and "country"
keys:
cities = [
{'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
{'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
{'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
{'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
{'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]
...而且您想顯示按國家/地區排序的分層列表,以下所示:
印度
美國
日本
你可使用{% regroup %}
標籤來給每一個國家的城市分組。 如下模板代碼片斷將實現這一點:
{% regroup cities by country as country_list %}
<ul>
{% for country in country_list %}
<li>{{ country.grouper }}
<ul>
{% for city in country.list %}
<li>{{ city.name }}: {{ city.population }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
讓咱們來看看這個例子。 {% regroup %}
有三個參數: 你想要重組的列表, 被分組的屬性, 還有結果列表的名字. 在這裏,咱們經過country_list
屬性從新分組country
列表,並調用結果cities
。
{% regroup %}
產生一個清單(在本例中爲country_list
的組對象。 組對象是具備兩個字段的namedtuple()
的實例:
grouper
- 按分組的項目(例如,字符串「India」或「Japan」)。list
- 此羣組中全部項目的列表(例如,全部城市的列表,其中country ='India')。在Django更改1.11:
組對象已從字典更改成namedtuple()
。
Because {% regroup %}
produces namedtuple()
objects, you can also write the previous example as:
{% regroup cities by country as country_list %}
<ul>
{% for country, local_cities in country_list %}
<li>{{ country }}
<ul>
{% for city in local_cities %}
<li>{{ city.name }}: {{ city.population }}</li>
{% endfor %}
</ul>
</li>
{% endfor %}
</ul>
請注意,{% regroup %}
不會對其輸入進行排序! 咱們的例子依賴於事實:cities
列表首先由country
排序。 若是country
列表不經過cities
對其成員進行排序,則從新分組將天真顯示單個國家/地區的多個組。 例如,假設cities
列表已設置爲此(請注意,國家/地區未分組在一塊兒):
cities = [
{'name': 'Mumbai', 'population': '19,000,000', 'country': 'India'},
{'name': 'New York', 'population': '20,000,000', 'country': 'USA'},
{'name': 'Calcutta', 'population': '15,000,000', 'country': 'India'},
{'name': 'Chicago', 'population': '7,000,000', 'country': 'USA'},
{'name': 'Tokyo', 'population': '33,000,000', 'country': 'Japan'},
]
對於cities
的輸入,示例{% regroup %}
以上將致使如下輸出:
印度
美國
印度
美國
日本
另外一個解決方案是使用dictsort
過濾器對模板中的數據進行排序,若是您的數據在字典列表中:
{% regroup cities|dictsort:"country" by country as country_list %}
重置先前的循環,以便在下一次遇到時從其第一個項目從新啓動。 沒有參數, {% resetcycle %}
會重置模板中定義的最後一個{% cycle %}
用法示例:
{% for coach in coach_list %}
<h1>{{ coach.name }}</h1>
{% for athlete in coach.athlete_set.all %}
<p class="{% cycle 'odd' 'even' %}">{{ athlete.name }}</p>
{% endfor %}
{% resetcycle %}
{% endfor %}
這個示例將返回下面的HTML:
<h1>José Mourinho</h1>
<p class="odd">Thibaut Courtois</p>
<p class="even">John Terry</p>
<p class="odd">Eden Hazard</p>
<h1>Carlo Ancelotti</h1>
<p class="odd">Manuel Neuer</p>
<p class="even">Thomas Müller</p>
注意第一個塊以class="odd"
結束,新的以class="odd"
開頭。 沒有{% resetcycle %}
標籤,第二個塊將以class="even"
刪除HTML標籤之間的空白格. 包括製表符和換行.
用法示例:
{% spaceless %}
<p>
<a href="foo/">Foo</a>
</p>
{% endspaceless %}
這個示例將返回下面的HTML:
<p><a href="foo/">Foo</a></p>
注: 僅刪除 tags 之間的空格 – 而不是標籤和文本之間的。
返回與給定視圖和可選參數匹配的絕對路徑引用(不帶域名的URL)。 在解析後返回的結果路徑字符串中,每一個特殊字符將使用iri_to_uri()
編碼。
這是一種不違反DRY原則的輸出連接的方式,它能夠避免在模板中硬編碼連接路徑。
{% url 'some-url-name' v1 v2 %}
第一個參數是url()
name
。 它能夠是一個被引號引發來的字符串或者其餘的上下文變量. 其餘參數是可選的而且應該以空格隔開,這些值會在URL中以參數的形式傳遞. 上面的例子展現瞭如何傳遞位置參數. 固然你也可使用關鍵字參數.
{% url 'some-url-name' arg1=v1 arg2=v2 %}
不要把位置參數和關鍵字參數混在一塊兒使用。 URLconf所需的全部參數都應該存在。
例如,假設您有一個視圖app_views.py
,其URLconf接受客戶端ID(此處client()
是視圖文件app_views.client
)。 URLconf行可能以下所示:
('^client/([0-9]+)/$', app_views.client, name='app-views-client')
若是你的應用中的URLconf 已經被包含到項目 URLconf 中,好比下面這樣
('^clients/', include('project_name.app_name.urls'))
而後,在模板中,您能夠建立一個此視圖的連接,以下所示:
{% url 'app-views-client' client.id %}
模板標籤會輸出以下的字符串 /clients/client/123/
.
若是您要檢索名稱空間網址,請指定徹底限定名稱:
{% url 'myapp:view-name' %}
爲了建立條形圖等,此標籤計算給定值與最大值的比率,而後將該比率應用於常量。
像這樣:
<img src="bar.png" alt="Bar"
height="10" width="{% widthratio this_value max_value max_width %}" />
若是max_width
是175,max_value
是200,而且this_value
是100,則上述示例中的圖像將是88像素寬(由於175 / 200 = .875; .875 * 100 = 87.5,上舍入爲88)。
在某些狀況下,您可能想要捕獲變量中的widthratio
的結果。 它能夠是有用的,例如,在blocktrans
像這樣:
{% widthratio this_value max_value max_width as width %}
{% blocktrans %}The width is: {{ width }}{% endblocktrans %}
使用一個簡單地名字緩存一個複雜的變量 ,當你須要使用一個「昂貴的」方法(好比訪問數據庫)不少次的時候是很是有用的
像這樣:
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
填充變量(以上示例total
)僅適用於{% 與 %} t5>
和{% endwith %}
標籤。
你能夠分配多個上下文變量:
{% with alpha=1 beta=2 %}
...
{% endwith %}
參考文檔: https://yiyibooks.cn/xx/Django_1.11.6/ref/templates/builtins.html#ref-templates-builtins-tags
Django內置模板標籤
autoescape
block
comment
Csrf_token
cycle
debug
extends
filter
firstof
for
The current iteration of the loop (1-indexed)
變量 描述
forloop.counter 循環的當前迭代(1索引)
forloop.counter0 循環的當前迭代(0索引)
forloop.revcounter 循環結束的迭代次數(1索引)
forloop.revcounter0 循環結束的迭代次數(0索引)
forloop.first 若是這是第一次經過循環,則爲真
forloop.last 若是這是最後一次循環,則爲真
forloop.parentloop 對於嵌套循環,這是圍繞當前循環的循環
for … empty
for 標籤帶有一個可選的{% empty %} 從句,以便在給出的組是空的或者沒有被找到時,能夠有所操做。
它和下面的例子做用相等,可是更簡潔、更清晰甚至可能運行起來更快:
if
布爾運算符
if標籤可使用not,and或or來測試多個變量或取消給定變量:
容許同時使用and和or子句,and的優先級高於or :
解釋以下:
在if標記中使用實際括號是無效的語法。 若是您須要它們指示優先級,則應使用嵌套的if標記。
== operator
相等。 例如:
!= operator
不相等。 例如:
<operator
小於。 例如:
operator
大於。 例如:
<= operator
小於或等於。 例如:
= operator
大於或等於。 例如:
in操做符
包含在內。 許多Python容器支持此運算符,以測試給定值是否在容器中。 如下是 中的x 的一些示例將被解釋:
not in操做符
不包含在內。 這是in運算符的否認操做。
is operator
Django中的新功能1.10。
對象身份。 測試兩個值是否相同。 例如:
is not操做符
Django中的新功能1.10。
否認對象身份 測試兩個值是否不同。 這是is運算符的否認。 例如:
過濾器
你也能夠在 if表達式中使用過濾器。 像這樣:
複合表達式
全部上述操做符能夠組合以造成複雜表達式。 對於這樣的表達式,重要的是要知道在表達式求值時如何對運算符進行分組 - 即優先級規則。 操做符的優先級從低至高以下:
(這徹底依據Python)。 因此,例如,下面的複雜if標籤:
…將被解釋爲:
若是你想要不一樣的優先級,那麼你須要使用嵌套的if 標籤。 有時,爲了清楚起見,更好的是爲了那些不知道優先規則的人。
比較運算符不能像Python或數學符號中那樣「連接」。 例如,不能使用:
你應該使用:
ifchanged
include
注
include 標籤應該被理解爲是一種」將子模版渲染並嵌入HTML中」的變種方法,而不是認爲是」解析子模版並在被父模版包含的狀況下展示其被父模版定義的內容」.這意味着在不一樣的被包含的子模版之間並不共享父模版的狀態,每個子包含都是徹底獨立的渲染過程.
Block模塊在被包含 以前 就已經被執行. 這意味着模版在被包含以前就已經從另外一個block擴展並 已經被執行並完成渲染 - 沒有block模塊會被include引入並執行,即便父模版中的擴展模版.
加載自定義模板標籤集。
舉個例子, 下面這模板將會從package包中載入全部otherlibrary 和somelibrary 中已經註冊的標籤和過濾器:
now
It is the {% now "jS \o\f F" %}
這將顯示爲「這是9月4日」。
傳遞的格式也能夠是預約義的DATE_FORMAT,DATETIME_FORMAT,SHORT_DATE_FORMAT或SHORT_DATETIME_FORMAT之一。 預約義的格式可能會因當前語言環境和Format localization的啓用而有所不一樣,
例如:
regroup
而且想顯示按國家/地區排序的分層列表,以下所示:
你可使用{% regroup %}標籤來給每一個國家的城市分組。 如下模板代碼片斷將實現這一點:
{% regroup %}產生一個清單(在本例中爲country_list的組對象。 組對象是具備兩個字段的namedtuple()的實例:
在Django更改1.11:組對象已從字典更改成namedtuple()。
Because {% regroup %} produces namedtuple() objects, you can also write the previous example as:
請注意,{% regroup %}不會對其輸入進行排序! 咱們的例子依賴於事實:cities列表首先由country排序。 若是country列表不經過cities對其成員進行排序,則從新分組將天真顯示單個國家/地區的多個組。 例如,假設cities列表已設置爲此(請注意,國家/地區未分組在一塊兒):
對於cities的輸入,示例{% regroup %}以上將致使如下輸出:
這個問題的最簡單的解決方案是確保在你的視圖代碼中,數據是根據你想要顯示的順序排序。
另外一個解決方案是使用dictsort過濾器對模板中的數據進行排序,若是您的數據在字典列表中:
分組其餘屬性
用法示例:
這個示例將返回下面的HTML:
注意第一個塊以class=」odd」結束,新的以class=」odd」開頭。 沒有{% resetcycle %}標籤,第二個塊將以class=」even」
在這個例子中,咱們有交替的奇數/偶數行和第五行的「主要」行。 當類別更改時,只有五行週期被重置。
spaceless
templatetag
論據 輸出
openblock {%
closeblock %}
openvariable {{
closevariable }}
openbrace {
closebrace }
opencomment {#
closecomment #}
例如:
url
不要忘記在url() name之間放置引號,不然該值將被解釋爲上下文變量!
verbatim
widthratio
with