Django模板語言,標籤整理

Django模板語言 標籤

內置標籤引用

1. autoescape

控制自動轉義是否可用. 這種標籤帶有任何 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文本轉義

Django轉義默認是開啓的, 關閉轉義有兩種方式

(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>
 

頁面顯示結果:

文本內容

文本內容

 

2. block

通常在父模板可使用block標籤, 把變化的內容能夠包裹在block標籤內; 子模板引用父模板後, 可使用block標籤重寫內容, 覆蓋父模板中原來的內容.

實例:

 
 
 
 
 
 
<!-- 父模板html -->
<!DOCTYPE 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 %}
 

子模板的顯示結果:

子模板一:

這是年度新聞

頁面主題內容

子模板二:

這是年度新聞

子模板中內容

 

3. comment

在 {% comment %} 和 {% endcomment %},之間的內容會被忽略,做爲註釋。至關於多行註釋

示例:

 
 
 
 
 
 
{% comment %}
    <b>粗體</b>
    <div>
        <p>這是Index頁面</p>
    </div>
{% endcomment %}
 

這部分註釋的內容, 在服務器端就直接忽略到了, 不會發送給客戶端.

 

4. csrf_token

這個標籤用於跨站請求僞造保護.

客戶端在提交表單到服務端時, 若是表單中不寫這個標籤, 服務端會直接返回403 Forbidden的錯誤. 把這個標籤寫到表單中, 能夠避免發生這個錯誤.

當把csrf_token寫到表單中後, 其實客戶端在提交數據時, 會提交一個name=csrfmiddlewaretokenvalue爲隨機的64位字符給服務端, 服務端收到後, 會根據這串字符校驗客戶端的合法性.(若是想看這個csrfmiddlewaretoken的具體內容,能夠打開瀏覽器的調試控制檯; 你會看到一個屬性type='hidden'的input標籤, value已經有默認值).

表單

 
 
 
 
 
 
<form action="" method="POST">
    {% csrf_token %}
    <input type="text" name="name" placeholder="姓名">
    <button type="submit">提交</button>
</form>
 

 

5. cycle

每當這個標籤被訪問,則傳出一個它的可迭代參數的元素。 第一次訪問返回第一個元素,第二次訪問返回第二個參數,以此類推. 一旦全部的變量都被訪問過了,就會回到最開始的地方,重複下去

實例:

1) 這個標籤在循環中特別有用:

 
 
 
 
 
 
{% for o in some_list %}
    <tr class="{% cycle 'row1' 'row2' %}">
        ...
    </tr>
{% endfor %}
 

第一次迭代產生的HTML引用了 row1類,第二次則是row2類,第三次 又是row1 類,如此類推。

2) 你也可使用變量, 例如,若是你有兩個模版變量, rowvalue1rowvalue2, 你可讓他們的值像這樣替換:

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

 

6. debug

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

 

7. extends

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

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

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

 

8. filter

經過一個或多個過濾器對內容過濾。 做爲靈活可變的語法,多個過濾器被管道符號相鏈接,且過濾器能夠有參數。

注意塊中全部的內容都應該包括在endfilter 和filter 標籤中。

注: escapesafe過濾器不是可接受的參數。 而應使用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 %}
 

 

9. firstof

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

例如:

 
 
 
 
 
 
{% firstof var1 var2 var3 %}
 

它等價於:

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

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

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

 

10. for

循環組中的每個項目,並讓這些項目在上下文可用。 舉個例子,展現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 %}
 

請記住,對於點運算符,字典鍵查找優先於方法查找。若是要在模板中使用這些方法(itemsvalueskeys等),請避免添加名爲字典方法的鍵。

for循環可用的參數:

變量 描述
forloop.counter 當前循環的索引值(索引從1開始)
forloop.counter0 當前循環的索引值(索引從0開始)
forloop.revcounter 當前循環的倒序索引值(索引從1開始)
forloop.revcounter0 當前循環的倒序索引值(索引從0開始)
forloop.first 若是這是第一次循環,返回True
forloop.last 若是這是最後一次循環,則爲True
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標籤可使用notandor來測試多個變量的布爾值.

 

13. include

加載模板並以標籤內的參數渲染。 這是一種能夠引入別的模板的方法。

模板名能夠是變量或者是硬編碼的字符串,能夠用單引號也能夠是雙引號.

下面這個示例包括模板"foo/bar.html"的內容:

 
 
 
 
 
 
{% include "foo/bar.html" %}
 

一般模板名稱是相對於模板加載器的根目錄。 字符串參數也能夠是以./../開頭的相對路徑,如extends標籤中所述。

 

14. load

加載自定義模板標籤集。

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

 
 
 
 
 
 
{% load somelibrary package.otherlibrary %}
 

你還可使用from參數從庫中選擇性加載單個過濾器或標記。 在下面這個示例中,名爲somelibrarybar的模板標籤/過濾器將從foo加載:

 
 
 
 
 
 
{% load foo bar from somelibrary %}
 

 

15. now

顯示最近的日期或事件,能夠經過給定的字符串格式顯示。

實例:

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

 

16. regroup

用類似對象間共有的屬性重組列表.

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'},
]
 

...而且您想顯示按國家/地區排序的分層列表,以下所示:

  • 印度

    • 孟買:19,000,000
    • 加爾各答:15,000,000
  • 美國

    • 紐約:20,000,000
    • 芝加哥:7,000,000
  • 日本

    • 東京: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_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 %}以上將致使如下輸出:

  • 印度

    • 孟買:19,000,000
  • 美國

    • 紐約:20,000,000
  • 印度

    • 加爾各答:15,000,000
  • 美國

    • 芝加哥:7,000,000
  • 日本

    • 東京:33,000,000

另外一個解決方案是使用dictsort過濾器對模板中的數據進行排序,若是您的數據在字典列表中:

 
 
 
 
 
 
{% regroup cities|dictsort:"country" by country as country_list %}
 

 

17. resetcycle

重置先前的循環,以便在下一次遇到時從其第一個項目從新啓動。 沒有參數, {% 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"

 

18. spaceless

刪除HTML標籤之間的空白格. 包括製表符和換行.

用法示例:

 
 
 
 
 
 
{% spaceless %}
    <p>
        <a href="foo/">Foo</a>
    </p>
{% endspaceless %}
 

這個示例將返回下面的HTML:

 
 
 
 
 
 
<p><a href="foo/">Foo</a></p>
 

注: 僅刪除 tags 之間的空格 – 而不是標籤和文本之間的。

 

19. url

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

 

20. widthratio

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

像這樣:

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

 

21. with

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

像這樣:

 
 
 
 
 
 
{% 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內置模板標籤

  1. autoescape

    • 控制自動轉義是否可用,這種標籤帶有任何on和off做爲參數的話,他將決定轉義塊內效果。
    • 該標籤會以一個endautoescape做爲結束標籤。
    • 當自動轉義生效時,全部變量內容會被轉義成HTML輸出(在全部過濾器生效後)這等同與
手動將 escape篩選器應用於每一個變量。
  • 惟一一個例外是,變量或者經過渲染變量的代碼,或者由於他已經應用了safe或escape過
濾器,已經被標記爲「safe」
 
例如
 
{% autoescape on %}
{{ body }}
{% endautoescape %}
  1. block

    • block 標籤能夠被子模板覆蓋
  2. comment

    • 在{% comment %} 和 {% endcomment %},之間的內容會被忽略,做爲註釋。在第一個 
      標籤能夠插入一個可選的記錄。好比,當要註釋掉一些代碼時,能夠用此來記錄代碼被注 
      釋掉的緣由。
例如:
 
<p>Rendered text with {{ pub_date|date:"c" }}</p>
 
{% comment "Optional note" %}
<p>Commented out text with {{ create_date|date:"c" }}</p>
{% endcomment %}
 
comment標籤不能嵌套使用.
  1. Csrf_token

    • 這個標籤用於跨站請求僞造保護
  2. cycle

    • 每當這個標籤被訪問,則傳出一個它的可迭代參數的元素。第一次訪問返回第一個元素,第二 
      次訪問返回第二個參數,依次類推,一旦全部的變量都被訪問過了,就會回到最開始的地方, 
      重複下去。 
      這個標籤在循環中特別好用
{% for o in some_list %}
<tr class="{% cycle 'row1' 'row2' %}">
...
</tr>
{% endfor %}
 
第一次迭代產生的HTML引用了row1類,第二次則是row2類,如此類推。
  • 也可使用變量,例如,若是有兩個模板變量,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標籤中使用as 關鍵字時,關於{% cycle %}的使用,會啓動cycle而且直接產生第一個值。 若是你想要在嵌套循環中或者included模版中使用這個值,那麼將會遇到困難。 若是你只是想要聲明cycle,可是不產生第一個值,你能夠添加一個silent關鍵字來做爲cycle標籤的最後一個關鍵字。 像這樣:
{% for obj in some_list %}
{% cycle 'row1' 'row2' as rowcolors silent %}
<tr class="{{ rowcolors }}">{% include "subtemplate.html" %}</tr>
{% endfor %}
 
這將輸出row1元素的列表,其中class在row1和row2之間交替。 子模板將在其上下文中訪問rowcolors,而且該值將匹配包圍它的<tr>的類。 若是省略row2關鍵字,則row1和silent將做爲正常文本發出,
  • The following template would output nothing, even though the second call to{% cycle %} doesn’t specify silent:
{% cycle 'row1' 'row2' as rowcolors silent %}
{% cycle rowcolors %}
 
可使用resetcycle標籤製做{% 循環 %}標籤從下一次遇到的第一個值從新啓動。
  1. debug

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

    • 表示當前模板繼承自一個父模板 
      這個標籤能夠有如下兩種用法
    • {% extends 「base.html」 %} (要有引號).繼承名爲」base.html」的父模板
    • {% extends variable %}使用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" %}
  1. filter

    • 經過一個或多個過濾器對內容過濾。 做爲靈活可變的語法,多個過濾器被管道符號相鏈接,且過濾器能夠有參數。
例如:
 
{% filter force_escape|lower %}
This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}
  1. firstof

    • 輸出第一個不爲False參數。若是傳入的全部變量都爲False,就什麼也不輸出。
例如:
 
{% firstof var1 var2 var3 %}
 
它等價於:
 
{% if var1 %}
{{ var1 }}
{% elif var2 %}
{{ var2 }}
{% elif var3 %}
{{ var3 }}
{% endif %}
  • 固然你也能夠用一個默認字符串做爲輸出以防傳入的全部變量都是False:
{% firstof var1 var2 var3 "fallback value" %}
  • 標籤auto-escapes是開啓的, 你能夠禁止自動轉義:
{% autoescape off %}
{% firstof var1 var2 var3 "<strong>fallback value</strong>" %}
{% endautoescape %}
  • 若是隻想要部分變量被規避,能夠這樣使用:
{% firstof var1 var2|safe var3 "fallback value"|safe %}
 
You can use the syntax {% firstof var1 var2 var3 as value %} to store the output inside a variable.
  1. for

for

  • 循環組中的每個項目,並讓這些項目在上下文可用。 舉個例子,展現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 %}
  • 請記住,對於點運算符,字典鍵查找優先於方法查找。
  • Therefore if the data dictionary contains a key named ‘items’, data.items will return data[‘items’] instead ofdata.items().
  • 若是要在模板中使用這些方法(items,values,keys等),請避免添加名爲字典方法的鍵。
  • 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 %} 從句,以便在給出的組是空的或者沒有被找到時,能夠有所操做。

<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>
  1. 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標記中使用實際括號是無效的語法。 若是您須要它們指示優先級,則應使用嵌套的if標記。

  • if tags may also use the operators ==, !=, <, >, <=, >=, in, not in, is, and is not which work as follows:

== operator

相等。 例如:

{% if somevar == "x" %}
This appears if variable somevar equals the string "x"
{% endif %}

!= operator

不相等。 例如:

{ % if somevar != "x" %}
This appears if variable somevar does not equal the string "x",
or if somevar is not found in the context
{ % endif %}

<operator

小於。 例如:

{% if somevar < 100 %}
This appears if variable somevar is less than 100.
{% endif %}

operator

大於。 例如:

{% if somevar > 0 %}
This appears if variable somevar is greater than 0.
{% endif %}

<= operator

小於或等於。 例如:

{% if somevar <= 100 %}
This appears if variable somevar is less than 100 or equal to 100.
{% endif %}

= operator

大於或等於。 例如:

{% if somevar >= 1 %}
This appears if variable somevar is greater than 1 or equal to 1.
{% endif %}

in操做符

包含在內。 許多Python容器支持此運算符,以測試給定值是否在容器中。 如下是 中的x 的一些示例將被解釋:

{% 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 in users %}
If users is a QuerySet, this will appear if user is an
instance that belongs to the QuerySet.
{% endif %}

not in操做符

不包含在內。 這是in運算符的否認操做。

is operator

Django中的新功能1.10。

對象身份。 測試兩個值是否相同。 例如:

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

is not操做符

Django中的新功能1.10。

否認對象身份 測試兩個值是否不同。 這是is運算符的否認。 例如:

{% 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 %} (WRONG)

你應該使用:

{% if a > b and b > c %}
  1. 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="background-color:
{% ifchanged match.ballot_id %}
{% cycle "red" "blue" %}
{% else %}
gray
{% endifchanged %}
">{{ match }}</div>
{% endfor %}
  1. include

    • 加載模板並以標籤內的參數渲染。 這是一種能夠引入別的模板的方法。 
      模板名能夠是變量或者是硬編碼的字符串,能夠用單引號也能夠是雙引號. 
      下面這個示例包括模板」foo/bar.html」的內容:
{% include "foo/bar.html" %}
  • 一般模板名稱是相對於模板加載器的根目錄。 字符串參數也能夠是以./或../開頭的相對路徑,如extends標籤中所述。 
    Django中的新功能1.10:添加了使用相對路徑的能力。 
    此示例包括其名稱包含在變量template_name中的模板的內容:
{% include template_name %}
  • 變量也能夠是任何實現了render() 方法接口的對象,這個對象要能夠接收上下文(context)。 這就容許你在context中引用一個已經被編譯過的Template。 
    被包含的模板在包含它的模板的上下文中渲染。 
    下面這個示例生成輸出「Hello, John!」: 
    上下文:變量greeting設置爲」John」,變量person設置爲」Hello」。 
    模板:
{% 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 %}
  • 若是包含的模板在渲染時致使異常(包括缺乏或具備語法錯誤),行爲會因template engine’s而異。 debug選項(若是未設置,此選項默認爲DEBUG的值)。 當調試模式打開時,將出現TemplateDoesNotExist或TemplateSyntaxError之類的異常。當調試模式關閉時,{% 包括 %}向django.template記錄器,除了在渲染所包含的模板並返回一個空字符串時發生的異常。
  • 自1.11版以來已棄用 渲染{% 包含 %}模板標記的沉默異常已棄用。 在Django 2.1中,將會提出異常。
  • 注 
    include 標籤應該被理解爲是一種」將子模版渲染並嵌入HTML中」的變種方法,而不是認爲是」解析子模版並在被父模版包含的狀況下展示其被父模版定義的內容」.這意味着在不一樣的被包含的子模版之間並不共享父模版的狀態,每個子包含都是徹底獨立的渲染過程. 
    Block模塊在被包含 以前 就已經被執行. 這意味着模版在被包含以前就已經從另外一個block擴展並 已經被執行並完成渲染 - 沒有block模塊會被include引入並執行,即便父模版中的擴展模版.

    1. load
  • 加載自定義模板標籤集。 
    舉個例子, 下面這模板將會從package包中載入全部otherlibrary 和somelibrary 中已經註冊的標籤和過濾器:

{% load somelibrary package.otherlibrary %}
  • 還可使用from參數從庫中選擇性加載單個過濾器或標記。 在下面這個示例中,名爲somelibrary和bar的模板標籤/過濾器將從foo加載:
{% load foo bar from somelibrary %}
  1. now

    • 顯示最近的日期或事件,能夠經過給定的字符串格式顯示。 此類字符串能夠包含格式說明符字符,如date過濾器部分中所述。 
      例如:
It is {% now "jS F Y H:i" %}
 
 
 
 
  • 注意!,若是你想要使用「raw」值,你可以反斜槓轉義一個格式化字符串。 在這個例子 中,「o」和「f」都是反斜槓轉義,由於若是不這樣,會分別顯示年和時間:
It is the {% now "jS \o\f F" %}

這將顯示爲「這是9月4日」。

傳遞的格式也能夠是預約義的DATE_FORMAT,DATETIME_FORMAT,SHORT_DATE_FORMAT或SHORT_DATETIME_FORMAT之一。 預約義的格式可能會因當前語言環境和Format localization的啓用而有所不一樣,

例如:

It is {% now "SHORT_DATETIME_FORMAT" %}
  • 也可使用語法{% now 「Y」 as current_year %}將輸出(做爲字符串)存儲在變量中。 This is useful if you want to use {% now %} inside a template tag likeblocktrans for example:
{% now "Y" as current_year %}
{% blocktrans %}Copyright {{ current_year }}{% endblocktrans %}
  1. regroup

    • 用類似對象間共有的屬性重組列表.
    • 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'},
]

而且想顯示按國家/地區排序的分層列表,以下所示:

  • 印度 
    • 孟買:19,000,000
    • 加爾各答:15,000,000
  • 美國 
    • 紐約:20,000,000
    • 芝加哥:7,000,000
  • 日本 
    • 東京: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_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 %}以上將致使如下輸出:

  • 印度 
    • 孟買:19,000,000
  • 美國 
    • 紐約:20,000,000
  • 印度 
    • 加爾各答:15,000,000
  • 美國 
    • 芝加哥:7,000,000
  • 日本 
    • 東京:33,000,000

這個問題的最簡單的解決方案是確保在你的視圖代碼中,數據是根據你想要顯示的順序排序。

另外一個解決方案是使用dictsort過濾器對模板中的數據進行排序,若是您的數據在字典列表中:

{% regroup cities|dictsort:"country" by country as country_list %}

分組其餘屬性

  • 一個有效的模版查找是一個regroup標籤的合法的分組屬性。包括方法,屬性,字典健和列表項。 例如,若是「country」字段是具備屬性「description」的類的外鍵,則可使用:
{% regroup cities by country.description as country_list %}
  • 或者,若是choices是具備choices的字段,則它將具備做爲屬性的get_FOO_display()方法,顯示字符串而不是country鍵:
{% regroup cities by get_country_display as country_list %}
{{ country.grouper }}`如今會顯示`choices
  1. resetcycle
Django中的新功能1.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 %}

在這個例子中,咱們有交替的奇數/偶數行和第五行的「主要」行。 當類別更改時,只有五行週期被重置。

  1. 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 %}
  1. templatetag

    • 輸出用於構成模板標記的語法字符之一。
    • 因爲模板系統沒有「轉義」的概念,爲了顯示模板標籤中使用的一個位,必須使用{% templatetag %}標記。
    • 參數指定要輸出哪一個模板位:

    論據 輸出 
    openblock {% 
    closeblock %} 
    openvariable {{ 
    closevariable }} 
    openbrace { 
    closebrace } 
    opencomment {# 
    closecomment #}

例如:

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

    • 返回與給定視圖和可選參數匹配的絕對路徑引用(不帶域名的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/.
 
請注意,若是您要反查的網址不存在,您會收到NoReverseMatch異常,這會致使您的網站顯示
 
錯誤網頁。
 
若是但願在不顯示網址的狀況下檢索網址,則可使用略有不一樣的調用:
 
{% url 'some-url-name' arg arg2 as the_url %}
 
<a href= "{{ the_url }}">I'm linking to {{ the_url }}</a>
  • as var語法建立的變量的範圍是{% 塊 %}其中{% url %} 標籤出現。 
    此標籤 {% url … as VAR %} 語法將不致使錯誤,若是視圖丟失。 實際上,您將使用此連接來連接到可選的視圖:
{% url 'some-url-name' as the_url %}
{% if the_url %}
<a href="{{ the_url }}">Link to optional stuff</a>
{% endif %}
  • 若是要檢索名稱空間網址,請指定徹底限定名稱:
{% url 'myapp:view-name' %}
 
這將遵循正常的namespaced URL resolution strategy,包括使用上下文對當前應用程序提供的任何提示。
  • 警告

不要忘記在url() name之間放置引號,不然該值將被解釋爲上下文變量!

  1. verbatim

    • 中止模版引擎在該標籤中的渲染/
    • 常見的用法是容許與Django語法衝突的JavaScript模板圖層。 像這樣:
{% verbatim %}
{{if dying}}Still alive.{{/if}}
{% endverbatim %}
  • You can also designate a specific closing tag, allowing the use of {% endverbatim %} as part of the unrendered contents:
{% verbatim myblock %}
Avoid template rendering via the {% verbatim %}{% endverbatim %} block.
{% endverbatim myblock %}
  1. widthratio

    • 爲了建立條形圖等,此標籤計算給定值與最大值的比率,而後將該比率應用於常量。 
      像這樣:
<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 %}
  1. with

    • 使用一個簡單地名字緩存一個複雜的變量 ,當你須要使用一個「昂貴的」方法(好比訪問數據庫)不少次的時候是很是有用的 
      像這樣:
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
  • 填充變量(以上示例total)僅適用於{% with %} t5>和{% endwith %}標籤。 
    能夠分配多個上下文變量:
{% with alpha=1 beta=2 %}
...
{% endwith %}
相關文章
相關標籤/搜索