能夠查詢下表來總覽Django的內置標籤:html
標籤 | 說明 |
---|---|
autoescape | 自動轉義開關 |
block | 塊引用 |
comment | 註釋 |
csrf_token | CSRF令牌 |
cycle | 循環對象的值 |
debug | 調試模式 |
extends | 繼承模版 |
filter | 過濾功能 |
firstof | 輸出第一個不爲False的參數 |
for | 循環對象 |
for … empty | 帶empty說明的循環 |
if | 條件判斷 |
ifequal | 若是等於 |
ifnotequal | 若是不等於 |
ifchanged | 若是有變化,則.. |
include | 導入子模版的內容 |
load | 加載標籤和過濾器 |
lorem | 生成無用的廢話 |
now | 當前時間 |
regroup | 根據對象重組集合 |
resetcycle | 重置循環 |
spaceless | 去除空白 |
templatetag | 轉義模版標籤符號 |
url | 獲取url字符串 |
verbatim | 禁用模版引擎 |
widthratio | 寬度比例 |
with | 上下文變量管理器 |
控制自動轉義是否可用。參數是on或off。 該標籤會以一個endautoescape做爲結束標籤.數據庫
例如:django
{% autoescape on %} {{ body }} {% endautoescape %}
block標籤能夠被子模板覆蓋。緩存
在{% comment %}
和{% endcomment %}
之間的內容會被忽略,做爲註釋。app
好比,當要註釋掉一些代碼時,能夠用此來記錄代碼被註釋掉的緣由。less
例如:dom
<p>Rendered text with {{ pub_date|date:"c" }}</p> {% comment "Optional note" %} <p>Commented out text with {{ create_date|date:"c" }}</p> {% endcomment %}
comment標籤不能嵌套使用。oop
這個標籤用於跨站請求僞造保護。經常使用於爲form表單提供csrf令牌。測試
每當這個標籤被訪問,返回它的下一個元素。第一次訪問返回第一個元素,第二次訪問返回第二個參數,以此類推. 一旦全部的變量都被訪問過了,就會回到最開始的地方,重複下去。這個標籤在循環中特別有用:this
{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2'%}"> ... </tr> {% endfor %}
第一次迭代產生的HTML引用了row1類,第二次則是row2類,第三次又是row1 類,如此類推。
cycle的本質是根據某個規律,提供某種特性,好比想循環給表格的行添加底色等等。
也可使用變量, 例如,若是你有兩個模版變量: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 %}
在某些狀況下,可能須要連續引用一個當前循環的值,而不前進到下一個循環值。要達到這個目的,只需使用as
來給{% cycle %}
取一個別名,就像這樣:
{% cycle 'row1' 'row2' as rowcolors %}
從那時起(設置別名後),你能夠將別名看成一個模板變量進行引用,從而隨意在模板中插入當前循環的值。 若是要將循環值移動到原始cycle標記的下一個值,可使用另外一個cycle標記並指定變量的名稱。看下面的例子:
<tr>
<td class="{% cycle 'row1' 'row2' as rowcolors %}">...</td> <td class="{{ rowcolors }}">...</td> </tr> <tr> <td class="{% cycle rowcolors %}">...</td> <td class="{{ rowcolors }}">...</td> </tr>
將輸出:
<tr>
<td class="row1">...</td> <td class="row1">...</td> </tr> <tr> <td class="row2">...</td> <td class="row2">...</td> </tr>
cycle 標籤中,經過空格分割,可使用任意數量的值。被包含在單引號(')或者雙引號(")中的值被認爲是可迭代字符串,相反,沒有被引號包圍的值被看成模版變量。
輸出整個調試信息,包括當前上下文和導入的模塊。
表示當前模板繼承自一個父模板。
這個標籤能夠有兩種用法:
Django1.10中添加了使用相對路徑的能力。一般模板名稱是相對於模板加載器的根目錄。字符串參數也能夠是以./
或../
開頭的相對路徑。 例如,假設有如下目錄結構:
dir1/ template.html base2.html my/ base3.html base1.html
在template.html中,如下路徑將有效:
{% extends "./base2.html" %} {% extends "../base1.html" %} {% extends "./my/base3.html" %}
經過一個或多個過濾器對內容過濾。須要結束標籤endfilter。
例如:
{% filter force_escape|lower %} This text will be HTML-escaped, and will appear in all lowercase. {% endfilter %}
輸出第一個不爲False參數。 若是傳入的全部變量都爲False,就什麼也不輸出。
例如:
{% firstof var1 var2 var3 %}
它等價於:
{% if var1 %} {{ var1 }} {% elif var2 %} {{ var2 }} {% elif var3 %} {{ var3 }} {% endif %}
固然也能夠用一個默認字符串做爲輸出以防止傳入的全部變量都是False:
{% firstof var1 var2 var3 "fallback value" %}
循環對象中的每個元素
<ul>
{% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
可使用{% for obj in list reversed %}
進行反向循環。
若是循環對象points的每一個元素都是(x,y)這樣的二元元組,能夠像如下面同樣輸出:
{% for x, y in points %} There is a point at {{ x }},{{ y }} {% endfor %}
若是你想訪問一個字典中的鍵值,這個方法一樣有用:
{% for key, value in data.items %} {{ key }}: {{ value }} {% endfor %}
請記住,對於點運算符,字典鍵查找優先於方法查找。
下面是Django爲for標籤內置的一些屬性,能夠看成變量同樣使用{{ }}
在模版中使用。
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來測試布爾值:
{% if athlete_list and coach_list %} Both athletes and coaches are available. {% endif %} {% if not athlete_list %} There are no athletes. {% endif %} {% if athlete_list or coach_list %} There are some athletes or some coaches. {% endif %} {% if not athlete_list or coach_list %} There are no athletes or there are some coaches. {% endif %} {% if athlete_list and not coach_list %} There are some athletes and absolutely no coaches. {% endif %}
容許同時使用and和or子句,and的優先級高於or :
{% if athlete_list and coach_list or cheerleader_list %}
將解釋以下:
if (athlete_list and coach_list) or cheerleader_list
在if標籤中使用實際括號是錯誤的語法,這點不一樣於Python。若是須要爲它們指示優先級,應使用嵌套的if標籤。
if標籤容許使用這些操做符:==
, !=
, <
, >
, <=
, >=
, in
, not in
, is
, is not
,以下面的列子所示:
{% if somevar == "x" %} This appears if variable somevar equals the string "x" {% endif %} {% if somevar != "x" %} This appears if variable somevar does not equal the string "x", or if somevar is not found in the context {% endif %} {% if somevar < 100 %} This appears if variable somevar is less than 100. {% endif %} {% if somevar > 0 %} This appears if variable somevar is greater than 0. {% endif %} {% if somevar <= 100 %} This appears if variable somevar is less than 100 or equal to 100. {% endif %} {% if somevar >= 1 %} This appears if variable somevar is greater than 1 or equal to 1. {% endif %} {% if "bc" in "abcdef" %} This appears since "bc" is a substring of "abcdef" {% endif %} {% if "hello" in greetings %} If greetings is a list or set, one element of which is the string "hello", this will appear. {% endif %} {% if user not in users %} If users is a QuerySet, this will appear if user is not an instance that belongs to the QuerySet. {% endif %} {% if somevar is True %} This appears if and only if somevar is True. {% endif %} {% if somevar is None %} This appears if somevar is None, or if somevar is not found in the context. {% endif %} {% if somevar is not True %} This appears if somevar is not True, or if somevar is not found in the context. {% endif %} {% if somevar is not None %} This appears if and only if somevar is not None. {% endif %}
也能夠在if表達式中使用過濾器。 像這樣:
{% if messages|length >= 100 %} You have lots of messages today! {% endif %}
全部上述操做符均可以組合以造成複雜表達式。對於這樣的表達式,重要的是優先級規則。操做符的優先級從低至高以下:
or and not in ==,!=,<,>,<= ,>=
與Python的規則是同樣的。 因此,對於下面的複雜if標籤:
{% if a == b or c == d and e %}
將被解釋爲:
(a == b) or ((c == d) and e)
若是想要不一樣的優先級,那麼你須要使用嵌套的if標籤,而不能使用圓括號。
比較運算符不能像Python或數學符號中那樣「連接」。 例如,不能使用:
{% if a > b > c %} (錯誤的用法)
應該使用:
{% if a > b and b > c %}
{% ifequal a b %} ... {% endifequal %}
是一種過期的寫法,等同於{% if a == b %} ... {% endif %}
。 一樣, {% ifnotequal a b %} ... {% endifnotequal %}
等同於{% if a != b %} ... {% endif %}
。這兩個標籤將在之後的版本中棄用。
檢查一個值是否在上一次的迭代中被改變了。
{% ifchanged %}
標籤一般用在循環裏。它有兩個用處:
檢查已經渲染過的內容的當前狀態。而且只會顯示發生改變的內容。例如,如下的代碼是輸出days的列表項,不過它只會輸出被修改過月份的項:
<h1>Archive for {{ year }}</h1> {% for date in days %} {% ifchanged %}<h3>{{ date|date:"F" }}</h3>{% endifchanged %} <a href="{{ date|date:"M/d"|lower }}/">{{ date|date:"j" }}</a> {% endfor %}
若是標籤內有多個值時,則會比較每個值是否與上一次不一樣。例如,如下顯示每次更改時的日期,若是小時或日期已更改,則顯示小時:
{% for date in days %} {% ifchanged date.date %} {{ date.date }} {% endifchanged %} {% ifchanged date.hour date.date %} {{ date.hour }} {% endifchanged %} {% endfor %}
ifchanged標記也能夠採用可選的{% else %}
將顯示值沒有改變的狀況:
{% for match in matches %} <div style=" color: rgb(153, 153, 153); font-weight: bold; font-style: italic;">{% ifchanged match.ballot_id %} {% cycle "red" "blue" %} {% else %} gray {% endifchanged %} ">{{ match }}</div> {% endfor %}
加載指定的模板並以標籤內的參數渲染。這是一種引入別的模板的方法,必定要將include和extend區分開!include相似Python的import。
{% include "foo/bar.html" %}
也可使用變量名template_name
:
{% include template_name %}
下面這個示例生成輸出「Hello, John!」:
context:變量greeting="Hello",變量person="John"。
模板:
{% include "name_snippet.html" %}
name_snippet.html模板:
{{ greeting }}, {{ person|default:"friend" }}!
可使用關鍵字參數將額外的上下文傳遞到模板:
{% include "name_snippet.html" with person="Jane" greeting="Hello" %}
若是僅使用提供的變量來渲染上下文,添加only選項。
{% include "name_snippet.html" with greeting="Hi" only %}
include標籤應該被理解爲是一種"將子模版渲染並嵌入當前HTML中"的變種方法,而不該該看做是"解析子模版並在被父模版包含的狀況下展示其被父模版定義的內容"。這意味着在不一樣的被包含的子模版之間並不共享父模版的狀態,每個子包含都是徹底獨立的渲染過程。
加載自定義模板標籤。
下面的模板將會從somelibrary和package包中的otherlibrary中載入全部已經註冊的標籤和過濾器:
{% load somelibrary package.otherlibrary %}
還可使用from參數從庫中選擇性加載單個過濾器或標記。
{% load foo bar from somelibrary %}
這個標籤是用來在模版中提供文字樣本以供測試用的。使用場景是什麼?
好比你要寫個demo,裏面要有一大段的文字和篇章,你不可能真的去寫一篇文章吧?若是懶得去網上COPY,又不肯意使用一堆毫無心義雜亂的亂碼,那麼使用這個方法,能夠幫你自動填充一些能夠閱讀的內容。
PS:Django考慮得真細.....
用法:
{% lorem [count] [method] [random] %}
可使用零個,一個,兩個或三個參數。 這些參數是:
{% lorem %}將輸出常見的「lorem ipsum」段落。 {% lorem 3 p %}輸出經常使用的「lorem ipsum」段落和兩個隨機段落,每段包裹在HTML`<p>`標籤中。 {% lorem 2 w random %}將輸出兩個隨機拉丁字。
顯示當前的日期或時間。能夠指定顯示的格式。 例如:
It is {% now "jS F Y H:i" %}
下面的例子中,「o」和「f」都被反斜槓轉義:
It is the {% now "jS \o\f F" %}
這將顯示爲「It is the 4th of September」。
還可使用語法{% now 「Y」 as current_year %}
將輸出存儲在變量中。
{% now "Y" as current_year %} {% blocktrans %}Copyright {{ current_year }}{% endblocktrans %}
用對象間共有的屬性重組列表。
對於下面的數據:
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'}, ]
若是你想顯示按國家/地區排序的分層列表,以下所示:
India Mumbai: 19,000,000 Calcutta: 15,000,000 USA New York: 20,000,000 Chicago: 7,000,000 Japan Tokyo: 33,000,000
可使用{% 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
屬性從新分組cities列表,並將結果保存在country_list
中。
country_list
的每一個元素是具備兩個字段的namedtuple()
的實例:
Django1.11中的新功能。
重置先前的循環,以便在下一次循環時從其第一個項目從新啓動。若是沒有參數,{% 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"開始。
還能夠重置循環標籤:
{% for item in list %} <p class="{% cycle 'odd' 'even' as stripe %} {% cycle 'major' 'minor' 'minor' 'minor' 'minor' as tick %}"> {{ item.data }} </p> {% ifchanged item.category %} <h1>{{ item.category }}</h1> {% if not forloop.first %}{% resetcycle tick %}{% endif %} {% endifchanged %} {% endfor %}
在這個例子中,咱們有交替的奇數/偶數行和每五行出現一次的‘major’行。當類別更改時,只有五行週期被重置。
刪除HTML標籤之間的空白,包括製表符和換行。
用法示例:
{% spaceless %}
<p>
<a href="foo/">Foo</a> </p> {% endspaceless %}
這個示例將返回下面的HTML:
<p><a href="foo/">Foo</a></p>
僅會刪除tags之間的空格,不會刪除標籤和文本之間的。下面的例子中,Hello周圍的空格不會被刪除:
{% spaceless %}
<strong>
Hello
</strong> {% endspaceless %}
輸出用於構成模板標籤的語法字符。
因爲模板系統沒有「轉義」的概念,沒法在HTML中使用‘\’轉義出相似{%
的字符。爲了顯示模板標籤自己,必須使用{% templatetag %}
標籤,並添加相應的參數:
{%
%}
{{
}}
{
}
{#
#}
例如:
{% templatetag openblock %} url 'entry_list' {% templatetag closeblock %}
返回與給定視圖和可選參數匹配的絕對路徑引用(不帶域名的URL)。在解析後返回的結果路徑字符串中,每一個特殊字符將使用iri_to_uri()
編碼。這能夠避免在模板中硬編碼超級連接路徑。
{% url 'some-url-name' v1 v2 %}
第一個參數是url()
的名字。 它能夠是一個被引號引發來的字符串或者其餘的上下文變量。其餘參數是可選的而且以空格隔開,這些值會在URL中以參數的形式傳遞。上面的例子展現瞭如何傳遞位置參數,固然也可使用關鍵字參數。
{% url 'some-url-name' arg1=v1 arg2=v2 %}
不要把位置參數和關鍵字參數混在一塊兒使用。URLconf所需的全部參數都應該提供。
例如,假設有一個視圖app_views.client
,其URLconf接受客戶端ID,並以下所示:
('^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 'some-url-name' arg arg2 as the_url %} <a href="{{ the_url }}">I'm linking to {{ the_url }}</a>
若是視圖不存在,{% url ... as var %}
語法不會致使錯誤。
{% url 'some-url-name' as the_url %} {% if the_url %} <a href="{{ the_url }}">Link to optional stuff</a> {% endif %}
若是使用urlconf的名稱空間網址,經過冒號指定徹底名稱,以下所示:
{% url 'myapp:view-name' %}
再次強調,是冒號,不是圓點不是斜槓!
禁止模版引擎在該標籤中進行渲染工做。
常見的用法是容許與Django語法衝突的JavaScript模板圖層工做。 像這樣:
{% verbatim %} {{if dying}}Still alive.{{/if}} {% endverbatim %}
爲了建立柱狀形圖,此標籤計算給定值與最大值的比率,而後將該比率應用於常量。
像這樣:
<img src="bar.png" alt="Bar" height="10" width="{% widthratio this_value max_value max_width %}" />
若是this_value
是175,max_value
是200,而且max_width
是100,則上述示例中的圖像將是88像素寬(由於175 / 200 = .875; .875 * 100 = 87.5,四捨五入入爲88)。
使用一個簡單地名字緩存一個複雜的變量,當你須要使用一個代價較大的方法(好比訪問數據庫)不少次的時候這是很是有用的。
像這樣:
{% with total=business.employees.count %} {{ total }} employee{{ total|pluralize }} {% endwith %}
total只在with標籤內部有效。
能夠分配多個變量:
{% with alpha=1 beta=2 %} ... {% endwith %}