本文參考 官方文檔 。
一 模板變量
格式: {{ variable_name }}
variable_name 命名規則與變量命名規則類似,允許字符數字下划線,不允許標點。
variable_name后面可以跟dot . 以此來訪問變量的屬性。查詢順序:
字典查詢
屬性或者方法查詢: 若為方法查詢,則要求該方法不需要傳入任何參數(且該方法的圓括號要省略)。
調用該方法后,會將該方法返回的結果賦予該變量。
數字索引查詢
二 內置標簽
格式: {% tag %}
1 block 定義一個可以被子模板覆蓋的區域。
{% block block_name %}
該文本可被替換
{% endblock %} <--結束標簽
2 comment 注釋標簽。模板引擎會忽略掉 {% comment %} 和 {% endcomment %} 之間的所有內容。
3 csrf_token 用來CSRF保護的標簽,詳情請閱讀 官方文檔。
4 cycle 循環使用標簽中給出的參數(可以是字符串),參數被耗盡時,則重新開始循環,支持 as 關鍵字。

{% for o in some_list %} <tr class="{% cycle 'row1' 'row2' %}"> ... </tr> {% endfor %}
5 autoescape 控制標簽內容是否被 轉義 。值為 on/off。如果開啟自動轉義的話,標簽會被過濾掉,比如:
< 小於號被過濾為 : <
> 大於號被過濾為 : >

{% for o in some_list %} <tr class="{% autoescape off %}{% cycle rowvalue1 rowvalue2 %}{% endautoescape %}"> ... </tr> {% endfor %}
6 debug 輸出完整的調試信息,包含上下文以及導入的模塊
7 extends 使用該標簽在模板中繼承某個模板。用法:
{% extends 'parent.html' %} 或者:
{% extends variable %}
在django1.10中可以使用相對路徑了, ‘ . ’表示當前目錄, ‘ .. ‘表示當前目錄的父目錄
8 filter 使用一個或者多個過濾器過濾某個塊的內容,可以使用管道符號 | 連接多個過濾器。過濾器也可以有參數。

{% filter force_escape|lower %}
This text will be HTML-escaped, and will appear in all lowercase.
{% endfilter %}
9 firstof 輸出第一個非False參數的值。在django1.9及以后支持 as 關鍵字。

{% firstof var1 var2 var3 %} <!-- 相當於 --> {% if var1 %} {{ var1 }} {% elif var2 %} {{ var2 }} {% elif var3 %} {{ var3 }} {% endif %} <!-- 保底值 --> {% firstof var1 var2 var3 "fallback value" %} <!-- 關閉自動轉義 --> {% autoescape off %} {% firstof var1 var2 var3 "<strong>fallback value</strong>" %} {% endautoescape %}
10 for 循環

<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul> <!-- 遍歷字典 --> {% for key, value in data.items %} {{ key }}: {{ value }} {% endfor %}
forloop.counter The current iteration of the loop (1-indexed) 當前循環次數的整數計數器,從一開始計數
forloop.counter0 The current iteration of the loop (0-indexed) .......從0開始計數
forloop.revcounter The number of iterations from the end of the loop (1-indexed) 循環中剩余項的整數變量,最后一次執行時變為1
forloop.revcounter0 The number of iterations from the end of the loop (0-indexed) ......變為0
forloop.first True if this is the first time through the loop 若當前循環為第一次循環,該值為True
forloop.last True if this is the last time through the loop ......為False
forloop.parentloop For nested loops, this is the loop surrounding the current one .....指向當前循環的上一次循環的forloop
for ... empty

<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% empty %} <li>Sorry, no athletes in this list.</li> {% endfor %} </ul>
11 if...elif...else
1 支持 and or not,且and和or可以聯用。但and的優先級高於or

{% if athlete_list and coach_list or cheerleader_list %} <!-- 解釋為 --> if (athlete_list and coach_list) or cheerleader_list
2 if標簽中不允許使用 () ,可以依靠嵌套if來實現
3 if標簽中的條件判斷語句有 == , != , > , < , >= , <= , in , not in , is , not is 。 is和not is是django1.10中的新特性。
4 if標簽中可以使用過濾器
5 if標簽衍生出了ifequal和ifnotequal,{% ifequal a b %} 等於 {% if a==b %}
12 ifchange 檢查循環中的某個值在最近一次循環時是否改變。可以使用 else 標簽。用法有兩個:
1 它會把要渲染的內容與前一次作比較,發生變化時才顯示它。

<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 %}
2 如果給的是一個或者多個變量,就會檢查其中任一個變量是否發生改變。

{% for date in days %}
{% ifchanged date.date %} {{ date.date }} {% endifchanged %}
{% ifchanged date.hour date.date %}
{{ date.hour }}
{% endifchanged %}
{% endfor %}
13 include 加載一個模板,並使用當前的context上下文渲染它。在一個模板中包含其他模板的一種方法。
用法: {% include 'polls/index.html' %}
django1.10中可以使用相對路徑。
14 load 裝載一個自定義的模板標簽集合,詳細信息請看 官方文檔 。
15 now 根據指定的格式顯示當前的日期或者時間

格式字符串 描述 示例輸出
a 'a.m.' 或者 'p.m.' 。(這與PHP中的輸出略有不同,因為為了匹配美聯社風格,它包含了句點。 'a.m.'
A 'AM' 或者 'PM' 。 'AM'
b 月份,文字式的,三個字母,小寫。 'jan'
d 一月的第幾天,兩位數字,帶前導零。 '01' 到 '31'
D 一周的第幾天,文字式的,三個字母。 'Fri'
f 時間,12小時制的小時和分鍾數,如果分鍾數為零則不顯示。 '1' , '1:30'
F 月份,文字式的,全名。 'January'
g 小時,12小時制,沒有前導零。 '1' 到 '12'
G 小時,24小時制,沒有前導零。 '0' 到 '23'
h 小時,12小時制。 '01' 到 '12'
H 小時,24小時制。 '00' 到 '23'
i 分鍾。 '00' 到 '59'
j 一月的第幾天,不帶前導零。 '1' 到 '31'
l 一周的第幾天,文字式的,全名。 'Friday'
L 是否為閏年的布爾值。 True 到 False
m 月份,兩位數字,帶前導零。 '01' 到 '12'
M 月份,文字式的,三個字母。 'Jan'
n 月份,沒有前導零。 '1' 到 '12'
N 美聯社風格的月份縮寫。 'Jan.' , 'Feb.' ,'March' , 'May'
O 與格林威治標准時間的時間差(以小時計)。 '+0200'
P 時間,12小時制的小時分鍾數以及a.m./p.m.,分鍾數如果為零則不顯示,用字符串表示特殊時間點,如 'midnight' 和 'noon' 。 '1 a.m.' , '1:30 p.m.' ,'midnight' ,'noon' , '12:30 p.m.'
r RFC 822 格式的日期。 'Thu, 21 Dec 2000 16:01:07 +0200'
s 秒數,兩位數字,帶前導零。 '00' 到 '59'
S 英語序數后綴,用於表示一個月的第幾天,兩個字母。 'st' , 'nd' , 'rd'到 'th'
t 指定月份的天數。 28 到 31
T 本機的時區。 'EST' , 'MDT'
w 一周的第幾天,數字,帶前導零。 '0' (Sunday) 到'6' (Saturday)
W ISO-8601 一年中的第幾周,一周從星期一開始。 1 , 23
y 年份,兩位數字。 '99'
Y 年份,四位數字。 '1999'
z 一年的第幾天。 0 到 365
Z 以秒計的時區偏移量,這個偏移量對於UTC西部時區總是負數,對於UTC東部時區總是正數。
16 regrop 把一組相似的對象根據某個共有的屬性重新分組。支持as關鍵字
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>
17 spaceless 去除html標簽左右的空白符,不會去除標簽內容中的空白符
18 url 返回一個不帶域名的絕對路徑引用。我們在URLconf中配置的url('pattern',view_function,name='url_name')中的name在這里就會
派上用場。支持as關鍵字
用法: {% url 'url_name' value1 value2.... %}
舉例: 當我們URLconf文件中有這么一行: url(r'^hello/(?P<num>[0-9]{1})$',view.hello,name='hello')
對應的template文件內容為: {% url 'hello' num %}
當我們在瀏覽器中輸入 localhost:8000/hello/2 時, 頁面就會返回 /hello/2/
三 內置過濾器
一般用法:{{ value|filter:argu }}
多個過濾器可以鏈用:{{ valeu|filter01:argu1|filter02:argu2 }}
1 add 將argu添加至value中。
若value為4,argu為2,則輸出6
若value為[1,2,3],argu為[4,5,6] 則輸出[1,2,3,4,5,6]
2 addslashes 在引號前添加反斜線。用法: {{ value|addslashes }}
若value為"I'm mncu",則輸出" I \'m mncu "
3 capfirst 首字母大寫
4 center 給定一個長度,讓字符串居中。{{ value|center:"15" }}
5 cut 刪除value中所有的argu。若value為'hello world' argu為' ',則輸出’helloworld'
6 date 將一個date類型根據指定的格式輸出

a 'a.m.' 或者 'p.m.' 。(這與PHP中的輸出略有不同,因為為了匹配美聯社風格,它包含了句點。 'a.m.'
A 'AM' 或者 'PM' 。 'AM'
b 月份,文字式的,三個字母,小寫。 'jan'
d 一月的第幾天,兩位數字,帶前導零。 '01' 到 '31'
D 一周的第幾天,文字式的,三個字母。 'Fri'
f 時間,12小時制的小時和分鍾數,如果分鍾數為零則不顯示。 '1' , '1:30'
F 月份,文字式的,全名。 'January'
g 小時,12小時制,沒有前導零。 '1' 到 '12'
G 小時,24小時制,沒有前導零。 '0' 到 '23'
h 小時,12小時制。 '01' 到 '12'
H 小時,24小時制。 '00' 到 '23'
i 分鍾。 '00' 到 '59'
j 一月的第幾天,不帶前導零。 '1' 到 '31'
l 一周的第幾天,文字式的,全名。 'Friday'
L 是否為閏年的布爾值。 True 到 False
m 月份,兩位數字,帶前導零。 '01' 到 '12'
M 月份,文字式的,三個字母。 'Jan'
n 月份,沒有前導零。 '1' 到 '12'
N 美聯社風格的月份縮寫。 'Jan.' , 'Feb.' ,'March' , 'May'
O 與格林威治標准時間的時間差(以小時計)。 '+0200'
P 時間,12小時制的小時分鍾數以及a.m./p.m.,分鍾數如果為零則不顯示,用字符串表示特殊時間點,如 'midnight' 和 'noon' 。 '1 a.m.' , '1:30 p.m.' ,'midnight' ,'noon' , '12:30 p.m.'
r RFC 822 格式的日期。 'Thu, 21 Dec 2000 16:01:07 +0200'
s 秒數,兩位數字,帶前導零。 '00' 到 '59'
S 英語序數后綴,用於表示一個月的第幾天,兩個字母。 'st' , 'nd' , 'rd'到 'th'
t 指定月份的天數。 28 到 31
T 本機的時區。 'EST' , 'MDT'
w 一周的第幾天,數字,帶前導零。 '0' (Sunday) 到'6' (Saturday)
W ISO-8601 一年中的第幾周,一周從星期一開始。 1 , 23
y 年份,兩位數字。 '99'
Y 年份,四位數字。 '1999'
z 一年的第幾天。 0 到 365
Z 以秒計的時區偏移量,這個偏移量對於UTC西部時區總是負數,對於UTC東部時區總是正數。 -43200 到

# 如果要顯示 2016-8-8 8:08 這樣的格式
{{ datetime_instance|date:"Y-m-j G:i" }}
7 default 若value的值為False,則使用argu作為默認值
8 default_if_none 只有當value的值為none時,才使用argu作為默認值。
9 dictsort 根據指定的argu對字典進行排序。value必須為字典類型
10 dictsortrevesed 逆序排序
11 escape 根據以下規則轉義html字符串
< is converted to < > is converted to > ' (single quote) is converted to ' " (double quote) is converted to " & is converted to &
12 filesizeformat 將value轉換為人類易讀的文件尺寸。若value為123456789 ,則輸出117.7MB
13 first 返回value的第一個元素
14 floatformat 若argu沒有給出,則默認顯示value的四舍五入后的保留一位小數的數字。value必須為數字。
15 get_digit value為數字,返回從右數第argu個數字。{{ value|get_digit:"2" }} 若value為1234567,則返回6
16 join 類似於Python中的str.join(list)
17 last 與first相反,返回value中最后一個元素
18 length 返回value的長度
19 length_is 若value的長度為argu,則返回True
20 linebreaks 將純文本中的換行符轉換為<br />和<p>
21 linenumbers 給value添加行號
22 ljust 根據給定的argu寬度的域內左對齊
23 lower 將value轉換為小寫
24 make_list 將value轉換為list,若value為‘123’,則輸出[1,2,3]
25 phone2numeric 將一個電話號碼(可能包含字母)轉化等價的數字值.比如: ‘800-COLLECT’ 將被轉化為 ‘800-2655328’.
26 random 從value中隨機挑選一個元素並返回
27 rjust 與ljust相反
28 safe 在django輸出之前,不會對字符串進行轉義。若使用多個過濾器,盡量將safe過濾器寫在最后。
29 slice 返回value的片段,value必需為list。類似於Python中list中slice的語法。{{ some_list|slice:":2" }} 返回前兩個元素
30 slugify 轉化為小寫, 移去非單詞字符(字母數字和下划線),將空白轉化為連字符,去除前后空白
31 stringformat 根據給定參數(一個格式字符串)格式化一個變量, 這個格式字符串使用 Python 字符串格式化語法,
例外之處是 “%” 運算符被省略.
32 striptags 過濾掉html標簽
33 time 根據指定的argu格式,對time進行格式化
34 title 將給定的字符串value轉化為標題類型的格式,也就是第一個單詞的首字母大寫,其余小寫。
35 truncatechars 若字符串value的長度大於argu,則將大於的部分省略。
{{ value|truncatechars:9 }} 若value為 'joel is a slug' 則輸出'joel i...'
36 upper 將value大寫
37 wordcont 輸出單詞的個數(單詞以空格區分)