Django內置模板標籤

Django內置標籤總覽

能夠查詢下表來總覽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 上下文變量管理器

1. autoescape

控制自動轉義是否可用。參數是on或off。 該標籤會以一個endautoescape做爲結束標籤.數據庫

例如:django

{% autoescape on %}  {{ body }} {% endautoescape %}

2. block

block標籤能夠被子模板覆蓋。緩存

3. comment

{% 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

4. csrf_token

這個標籤用於跨站請求僞造保護。經常使用於爲form表單提供csrf令牌。測試

5. cycle

每當這個標籤被訪問,返回它的下一個元素。第一次訪問返回第一個元素,第二次訪問返回第二個參數,以此類推. 一旦全部的變量都被訪問過了,就會回到最開始的地方,重複下去。這個標籤在循環中特別有用: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 標籤中,經過空格分割,可使用任意數量的值。被包含在單引號(')或者雙引號(")中的值被認爲是可迭代字符串,相反,沒有被引號包圍的值被看成模版變量。

6. debug

輸出整個調試信息,包括當前上下文和導入的模塊。

7. extends

表示當前模板繼承自一個父模板。

這個標籤能夠有兩種用法:

  • {% extends "base.html" %}:繼承名爲"base.html"的父模板
  • {% extends variable %}:使用variable變量表示的模版

Django1.10中添加了使用相對路徑的能力。一般模板名稱是相對於模板加載器的根目錄。字符串參數也能夠是以./../開頭的相對路徑。 例如,假設有如下目錄結構:

dir1/
    template.html
    base2.html
    my/
        base3.html
base1.html

在template.html中,如下路徑將有效:

{% extends "./base2.html" %} {% extends "../base1.html" %} {% extends "./my/base3.html" %}

8. filter

經過一個或多個過濾器對內容過濾。須要結束標籤endfilter。

例如:

{% filter force_escape|lower %}
    This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}

9. firstof

輸出第一個不爲False參數。 若是傳入的全部變量都爲False,就什麼也不輸出。

例如:

{% firstof var1 var2 var3 %}

它等價於:

{% if var1 %}  {{ var1 }} {% elif var2 %}  {{ var2 }} {% elif var3 %}  {{ var3 }} {% endif %}

固然也能夠用一個默認字符串做爲輸出以防止傳入的全部變量都是False:

{% firstof var1 var2 var3 "fallback value" %}

10. for

循環對象中的每個元素

<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標籤內置的一些屬性,能夠看成變量同樣使用{{ }}在模版中使用。

  • forloop.counter:循環的當前索引值,從1開始計數;經常使用於生成一個表格或者列表的序號!
  • forloop.counter0:循環的當前索引值,從0開始計數;
  • forloop.revcounter: 循環結束的次數(從1開始)
  • forloop.revcounter0 循環結束的次數(從0開始)
  • forloop.first:判斷當前是否循環的第一次,是的話,該變量的值爲True。咱們常常要爲第一行加點特殊的對待,就用得上這個判斷了,結合if。
  • forloop.last:若是這是最後一次循環,則爲真
  • forloop.parentloop:對於嵌套循環,返回父循環所在的循環次數。某些場景下,這是個大殺器,能解決你不少頭疼的問題。

11. for ... empty

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> 

12. if

{% 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標籤容許使用這些操做符:==!=<><=>=innot inisis 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 %}

13. ifequal和ifnotequal

{% ifequal a b %} ... {% endifequal %}是一種過期的寫法,等同於{% if a == b %} ... {% endif %}。 一樣, {% ifnotequal a b %} ... {% endifnotequal %}等同於{% if a != b %} ... {% endif %}。這兩個標籤將在之後的版本中棄用。

14. ifchanged

檢查一個值是否在上一次的迭代中被改變了。

{% 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 %} 

15. include

加載指定的模板並以標籤內的參數渲染。這是一種引入別的模板的方法,必定要將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中"的變種方法,而不該該看做是"解析子模版並在被父模版包含的狀況下展示其被父模版定義的內容"。這意味着在不一樣的被包含的子模版之間並不共享父模版的狀態,每個子包含都是徹底獨立的渲染過程。

16. load

加載自定義模板標籤。

下面的模板將會從somelibrary和package包中的otherlibrary中載入全部已經註冊的標籤和過濾器:

{% load somelibrary package.otherlibrary %}

還可使用from參數從庫中選擇性加載單個過濾器或標記。

{% load foo bar from somelibrary %}

17. lorem

這個標籤是用來在模版中提供文字樣本以供測試用的。使用場景是什麼?

好比你要寫個demo,裏面要有一大段的文字和篇章,你不可能真的去寫一篇文章吧?若是懶得去網上COPY,又不肯意使用一堆毫無心義雜亂的亂碼,那麼使用這個方法,能夠幫你自動填充一些能夠閱讀的內容。

PS:Django考慮得真細.....

用法:

{% lorem [count] [method] [random] %}

可使用零個,一個,兩個或三個參數。 這些參數是:

  • count :一個數字(或變量),其中包含要生成的段落或字數(默認值爲1)。
  • method:HTML中使用p標籤、仍是w標籤、仍是b標籤,決定文本格式。默認是「b」。
  • random:若是給出的話,random這個詞在生成文本時不會使用公共段落。 例子:
{% lorem %}將輸出常見的「lorem ipsum」段落。
{% lorem 3 p %}輸出經常使用的「lorem ipsum」段落和兩個隨機段落,每段包裹在HTML`<p>`標籤中。
{% lorem 2 w random %}將輸出兩個隨機拉丁字。

18. now

顯示當前的日期或時間。能夠指定顯示的格式。 例如:

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 %}

19. regroup

用對象間共有的屬性重組列表。

對於下面的數據:

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()的實例:

  • grouper - 分組的項目(例如,字符串「India」或「Japan」)。
  • list - 此羣組中全部項目的列表(例如,全部城市的列表,其中country ='India')。

20. resetcycle

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’行。當類別更改時,只有五行週期被重置。

21. spaceless

刪除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 %} 

22. templatetag

輸出用於構成模板標籤的語法字符。

因爲模板系統沒有「轉義」的概念,沒法在HTML中使用‘\’轉義出相似{%的字符。爲了顯示模板標籤自己,必須使用{% templatetag %}標籤,並添加相應的參數:

  • openblock:{%
  • closeblock: %}
  • openvariable: {{
  • closevariable: }}
  • openbrace :{
  • closebrace: }
  • opencomment: {#
  • closecomment: #}

例如:

{% templatetag openblock %} url 'entry_list' {% templatetag closeblock %}

23. url

返回與給定視圖和可選參數匹配的絕對路徑引用(不帶域名的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' %}

再次強調,是冒號,不是圓點不是斜槓!

24. verbatim

禁止模版引擎在該標籤中進行渲染工做。

常見的用法是容許與Django語法衝突的JavaScript模板圖層工做。 像這樣:

{% verbatim %}  {{if dying}}Still alive.{{/if}} {% endverbatim %}

25. widthratio

爲了建立柱狀形圖,此標籤計算給定值與最大值的比率,而後將該比率應用於常量。

像這樣:

<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)。

26. with

使用一個簡單地名字緩存一個複雜的變量,當你須要使用一個代價較大的方法(好比訪問數據庫)不少次的時候這是很是有用的。

像這樣:

{% with total=business.employees.count %}  {{ total }} employee{{ total|pluralize }} {% endwith %}

total只在with標籤內部有效。

能夠分配多個變量:

{% with alpha=1 beta=2 %}
    ...
{% endwith %}
相關文章
相關標籤/搜索