一、模板標簽
內置標簽:
1、autoescape
控制當前的自動轉義行為,此標記采用on或者off作為參數,並確定自動轉義是否在塊內有效。該塊以endautoescape結束標簽關閉。
views: def index(request): return render(request,'app02/index.html',{'title':'mypage','user':'<ul>dd</ul>'}) html: <body> {{ user }} #默認為不轉義#} {{ user|safe }} #轉義HTML標簽#} {% autoescape on %} #轉義HTML標簽后,按原樣輸出#} 轉義:{{ user }} {% endautoescape %} <br /> {% autoescape off %} 不轉義:{{ user }} {% endautoescape %} </body> outing: <ul>dd</ul> dd 轉義:<ul>dd</ul> 不轉義: dd
2、block
定義可以被子模板覆蓋的塊,為模板繼承時使用
3、comment
注釋一段代碼,標簽不能嵌套
4、cycle
多次循環迭代,給定的值,每次遇到此標簽就會生成一個參數對應第一個,如此類推,如循環完沒有參數了則繼續從頭開始循環。
<body> <ul> <li>{% cycle 'one' 'two' 'three' 'four' as infocycle %}</li> <li>{% cycle infocycle %}</li> <li>{% cycle infocycle %}</li> <li>{% cycle infocycle %}</li> <li>{% cycle infocycle %}</li> <li>{% cycle infocycle %}</li> <li>{% cycle infocycle %}</li> </ul> </body>
#outing
- one
- two
- three
- four
- one
- two
- three
可以使用多個模板變量,也可以使用變量加字符串的形式混合使用。
views: def dome(request): info = ['html','jques','dome'] row = {'one':'python','two':'javascript','three':'css'} return render(request,'app02/dome.html',{'info':info,'row':row}) html: <ol> <li>{% cycle info.0 info.1 info.2 'TOT' row.one row.three row.two as twovariable %}</li> <li>{% cycle twovariable %}</li> <li>{% cycle twovariable %}</li> <li>{% cycle twovariable %}</li> <li>{% cycle twovariable %}</li> <li>{% cycle twovariable %}</li> <li>{% cycle twovariable %}</li> <li>{% cycle twovariable %}</li> </ol>
#outing:
- html
- jques
- dome
- TOT
- python
- css
- javascript
- html
您可以在cycle
標記中使用任意數量的值,以空格分隔。包含在單引號('
)或雙引號("
)中的值被視為字符串文字,而不帶引號的值則被視為模板變量。
如果使用關鍵字,silent,將在第二次調用是使用上一個值。
<ol> <li>dd:{% cycle 1 2 3 'TOT' as twovariable %}</li> <li>{% cycle twovariable %}</li> <li>{% cycle twovariable silent %}</li> <li>{% cycle twovariable %}</li> <li>{% cycle twovariable %}</li> </ol>
#outing
- dd:1
- 2
- 2
- 3
- TOT
5、debug
輸出整個調試信息,包括當前上下文和導入的模塊
6、extends
表示該模板擴展了父模板
這個標簽有兩種使用方式:
{% extends "base.html" %}
(帶引號)使用文字值 "base.html"
作為父模板的名稱來擴展。
{% extends variable %}
使用的變量variable
。如果變量的計算結果為字符串,Django將使用該字符串作為父模板的名稱。如果變量評估為一個Template
對象,Django將使用該對象作為父模板。
通常,模板名稱是相對於模板加載程序的根目錄,字符串參數也可以是./開頭的相對路徑。
7、filter
通過一個或多個過濾器過濾塊的內容。可以使用管道指定多個過濾器,並且過濾器可以具有參數,就像變量語法一樣。
8、firstof
輸出不是第一個參數的變量為false,如果所有傳遞的變量都是false,則不輸出
{% firstof var1 var2 var3 %}
相當於:
{% if var1 %}
{{ var1 }}
{% elif var2 %}
{{ var2 }}
{% elif var3 %}
{{ var3 }}
{% endif %}
如果所有傳遞的變量都是False,您還可以使用文字字符串作為回退值:
{% firstof var1 var2 var3 "fallback value" %}
您可以使用該語法將輸出存儲在變量中。{% firstof var1 var2 var3 asvalue %}
9、for
循環輸出數組中的每個項目,使項目在上下文變量中可用。
循環列表的值:
<ul> {% for item in list %} <li>{{ item }}</li> {% endfor %} </ul>
可以使用reversed反向循環列表:
<ul> {% for item in list reversed %} <li>{{ item }}</li> {% endfor %} </ul>
列表可以使用嵌套循環:
<ul> {% for x in list1 %} {% for y in x %} <li>{{ y }}</li> {% endfor %} {% endfor %} </ul>
字典循環,可以使用items方法得到字典的建和值:
<ul> {% for k,v in row.items %} <li>{{ k }}={{ v }}</li> {% endfor %} </ul>
for循環再循環中設置的變量:
forloop.conter 循環的當前迭代索引從1開始計數
forloop.counter0 循環當前迭代的索引從0開始計數
forloop.revcounter 循環結束時的迭代次數(1索引)
forloop.revcounter0 循環結束時的迭代次數(0索引)
forloop.first 如果這是通過循環的第一次,則為真
forloop.last 如果這是通過循環的最后一次,則為真
forloop.parentloop 對於嵌套循環,這是圍繞當前循環的循環
<body> <ul> {% for i in li %} <li>{{ forloop.counter }}:{{ i }}</li> <!--從1開始索引計數--> {% endfor %} </ul> <br /> <ul> {% for i in li %} <li>{{ forloop.counter0 }}:{{ i }}</li> <!--從0開始索引計數--> {% endfor %} </ul> <ul> {% for i in li %} <li>{{ forloop.revcounter }}:{{ i }}</li> <!--從1開始反索引計數--> {% endfor %} </ul> <ul> {% for i in li %} <li>{{ forloop.counter0 }}:{{ i }}</li> <!--從0開始反索引計數--> {% endfor %} </ul> <ul> {% for i in li %} {% if forloop.first %} <!--判斷是通過循環第一次則添加類名--> <li class="first"> {% else %} <li> {% endif %} {{ i }} </li> {% endfor %} </ul> <ul> {% for number in li %} {{ number }} {% if not forloop.last %} <!--判斷不是最后一個索引則加逗號--> , {% endif %} {% endfor %} </ul> </body>
for empty:如果給定的數組為空或無法找到,則for標簽可以接受一個可選的子句,顯示文本:{% empty %}
<ul> {% for number in li1 %} {{ number }} {% empty %} <li>sorry ,no number in this li1.</li> <!--判斷如果迭代找不到活變量不存在則輸出empty的文本內容--> {% endfor %} </ul>
10、if
判斷標簽計算一個變量,並且該變量是真,即存在,不為空,不是flase的數據塊的內容被輸出:{% if %}
#views: def ifelse(request): po = request.POST.get('number') #獲取提交的數據 return render(request,'app02/ifelse.html',{'po':int(po)}) #傳遞給模板 #html: <form action="" method="post"> <p><input type="text" name="number"></p> <p><input type="submit" value="提交"></p> </form> {{ po }} {% if po >= 90 %} <h1>優秀:{{ po }}</h1> {% elif po >= 80 %} <h1>良好:{{ po }}</h1> {% elif po >= 70 %} <h1>一般:{{ po }}</h1> {% elif po >= 60 %} <h1>及格:{{ po }}</h1> {% else %} <h1>不及格:{{ po }}</h1> {% endif %} </body>
if標簽可以使用and,or或not以測試多個變量或否定一個給定的變量,允許在同一個標簽中使用兩個and和or子句,and優先級高於or。
if標簽還可以使用==,!=,<,>,<=,>=,in等運算符。
表達式的優先級從低到高:or - and - not - in - ==,!=,<,>,<=,>=
二、過濾器
1、include
加載模板並使用當前上下文進行渲染。這是在模板中“包含”其他模板的一種方式。
模板名稱可以是變量,也可以是單引號或雙引號的硬編碼(帶引號)的字符串。
2、load
加載自定義模板標記集
3、lorem
隨機顯示“lorem ipsum”拉丁文字。這對於在模板中提供示例數據很有用
4、now
顯示當前日期或者時間,使用根據給定字符串的格式,這樣的字符串可以寶行格式說明字符
5、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'}, ]
{% 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>
如果被用來分組的屬性值不連續出現的話,將會分出多個組,這是一個bug。
6、spaceless
刪除HTML標簽之間的空白,這包括制表符和換行符。
7、templatetag
輸出用於組成模板標簽的語法字符之一
由於模板系統沒有“轉義”的概念,因此要顯示模板標記中使用的某個位,必須使用該標記。{%templatetag %}
該參數告訴哪個模板位輸出:
論據 | 輸出 |
---|---|
openblock |
{% |
closeblock |
%} |
openvariable |
{{ |
closevariable |
}} |
openbrace |
{ |
closebrace |
} |
opencomment |
{# |
closecomment |
#} |
{% templatetag openblock %}url'www.baidu.com' {% templatetag closeblock %}
8、url
返回與給定試圖和可選參數匹配的絕對路徑引用(沒有域名的URL)路徑中的任何特殊字符都將使用編碼iri_to_uri().
9、verbatim
停止模板引擎渲染此塊標記的內容。
通常的用法是允許與Django語法沖突的JavaScript模板層
內置過濾器:
10、add將參數添加到值
{{ value|add:"2" }}
如果value
是4
,那么輸出將是6
。
此過濾器將首先嘗試將這兩個值強制為整數。如果失敗,它會嘗試將值加在一起。這將適用於某些數據類型(字符串,列表等),並在其他數據類型上失敗。如果失敗,結果將是一個空字符串。
11、addslashes:在引號前添加斜杠,例如:用於以CSV格式轉義字符串。
{{ "i'm using django"|addslashes }} #輸出為: i\'m using django
12、capfirst:大寫該值的第一個字符,如果第一個字符不是字母,則此過濾器不起作用。
{{ "i'm using django"|capfirst }} #輸出為: I'm using django
13、center:將值置於給定寬度的字段中
"{{ "django"|center:"30" }}"
14、cut:從給定字符串中刪除所有給定的值
"{{ "django"|cut:"j" }}"
15、date:根據給定的格式格式化日期。
{{ date|date:"Y-m-d H:i:s w" }}
Y:4位年;m:月;d:日;H:24小時時;i:分鍾;s:秒;w:星期,從0開始表示星期日
16、default:如果變量值為false,則使用給定的默認值,否則使用該值。
{{ value|default:"nothing" }}
17、default_if_none:如果值是None,則使用給定的默認值,否則,使用該值。
{{ value|default_if_none:"nothing" }}
18、dictsort:根據參數中給出的關鍵字列出字典並返回該列表。
市場場景,可以更加某個屬性進行數據排序重組:
[ {'title': '1984', 'author': {'name': 'George', 'age': 45}}, {'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}}, {'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}}, ] {% for book in books|dictsort:"author.age" %} * {{ book.title }} ({{ book.author.name }}) {% endfor %} * Alice (Lewis) * 1984 (George) * Timequake (Kurt)
19、dictsortreversed:獲取字典列表並返回該列表按照參數中給出的建以相反順序排序,這與上面的過濾器完全相同,但返回的值將按相反順序排列。
20、divisibleby:返回True值是否可以被參數整除。
{{ 9|divisibleby:"3" }} #返回true
21、escape:轉義字符串的HTML
<
轉換為<
>
轉換為>
'
(單引號)轉換為'
"
(雙引號)轉換為"
&
轉換為&
應用於escape
通常會對結果應用自動轉義的變量只會導致一輪轉義完成。所以即使在自動逃脫的環境中使用這個功能也是安全的。如果您想要應用多個轉義通行證,請使用force_escape
過濾器。
22、escapejs:轉義用於JavaScript字符串的字符。這並沒有使字符串安全為HTML或JavaScript模板文字的使用,但使用模板來生成JavaScript / JSON什么時候保護你的語法錯誤。
23、filesizeformat:人性化輸出可讀的值
{{ 123456|filesizeformat }} #輸出: 120.6 KB
24、first:返回列表中的第一個項目
{{ value|first }}
25、floatformat:在沒有參數的情況下使用時,將浮點數四舍五入到小數點后一位,但只有在顯示小數部分的情況下有用。
value 模板 產量 34.23234 {{ value|floatformat }} 34.2 34.00000 {{ value|floatformat }} 34 34.26000 {{ value|floatformat }} 34.334.23234 {{ value|floatformat }} 34.232
#可以指定四舍五入到小數后的第幾位:
如傳遞參數為0,則浮點數在四舍五入到最接近整數的值,如不帶參數則等效於-1。
26、force_escape:將HTML轉義應用於字符串
27、get_digit:給定一個整數,返回請求的數字,其中1是最右邊的數字,2是第二個最右邊的數字等。返回無效輸入的原始值(如果輸入或參數不是整數,或者如果參數小於1)。否則,輸出總是一個整數。
{{ po|get_digit:"2" }}
28、join使用字符串鏈接列表元素
{{ lis|join:"++" }}
29、last:返回列表中的最后一個元素
{{ lis|last }}
30、length:返回值的長度,適合於字符串和列表。如返回0則表明變量未定義。
{{ 'abcdefg'|length }}
31、length_is:如果值的長度是參數,則返回True,否則返回False。
{{ 'abcdefg'|length_is:"7" }}
32、linebreaks:將純文本中的換行符轉換成HTML中的換行符。
value = ‘Joel\nis a slug’ {{ value|linebreaks }} #output: Joel is a slug
33、linebreaksbr:將純文本中的所有換行符轉換為HTML換行符。
34、linenumbers:用行號顯示文本。
{{ value|linenumbers }}
35、左對齊給定寬度的字段中的值。
"{{ value|ljust:"10" }}"
36、lower:將字符串轉換為全部小寫。
{{ 'ABCD'|lower }}
37、返回轉換為列表的值,將字符串轉換為列表。
{{ value|make_list }} #output: ['D', 'j', 'a', 'n', 'g', 'o']
38、phone2numeric:將電話號碼(可能包含字母)轉換為數字等值。
{{ '800-COLLECT'|phone2numeric }} #output: 800-2655328
39、pluralize:如果值不為1,則返回復數后綴,默認情況下,該后綴為‘s'。
40、pprint:一個包裝,用於調試。
41、random:返回給定列表中的一個隨機元素。
42、rjust:在給定寬度的字段中右對齊該值。
43、safe:將字符串標記為在輸出之前不需要進一步的HTML轉義,自動轉義關閉時,此過濾器不起作用。
44、safeseq:將safe過濾器應用於序列的每一個元素,結合使用序列操作的其他過濾器很有用。
45、slice:返回列表的一部分,使用與python列表切片相同的語法。
lis = [1,2,3,4,5] {{ lis|slice:":2" }} #output [1, 2]
46、slugify:轉換為ASCII。將空格轉換為連字符。刪除非字母數字,下划線或連字符的字符。轉換大寫為小寫。也剝去前導和尾隨空白。
value = ' Django IS %a *fsd_dsf-kkk ' {{ value|slugify }} #output: django-is-a-fsd_dsf-kkk
47、stringformat:根據參數格式化變量,這是一個字符串格式化說明符,說明符使用printf風格的字符串格式語法,除了前面的“%”。
value = 10.1 {{ value|stringformat:"d" }} #output: #輸出整數 10
48、striptags:去除所有HTML標簽
value = "<b>Joel</b> <button>is</button> a <span>slug</span>" {{ value|striptags }} #output Joel is a slug
49、time:根據給定的時間格式,格式化輸出時間
Y:4位年;m:月;d:日;H:24小時時;i:分鍾;s:秒;w:星期,從0開始表示星期日
date = datetime.datetime.now() <li>{{ date }}</li> <li>{{ date|time:"H:i:s" }}</li> #output May 21, 2018, 12:33 p.m. 12:33:50
50、timesince:將日期格式化為自該日期以來的時間(例如,“4天,6小時”)。
51、timeuntil:類似於timesince
,除了它測量從現在開始直到給定日期或日期時間的時間
52、title:將字符串轉換為標題,方法是讓單詞以大寫字母開頭,其余字符以小寫字母開頭。這個標簽不會保留小寫字母。
<li>{{ "i am mr's zhang"|title }}</li> #output I Am Mr's Zhang
53、truncatechars:如果字符串長於指定的字符數,則截斷字符串。截斷的字符串將以可轉換的省略號序列(“...”)結尾。
<li>{{ "i am mr's zhang"|truncatechars:5}}</li> #output i ... #總長度保留5位
54、truncatechars_html:類似於truncatechars
,它知道HTML標記。在截斷點之后立即關閉在字符串中打開並且在截斷點之前未關閉的任何標記。
55、truncatwords:在一定數量的單詞之后截斷一個字符串。
<li>{{ "i am mr's zhang"|truncatewords:3}}</li> #output i am mr's ...
56、truncatewords_html:
類似於truncatewords
,它知道HTML標記。任何在字符串中打開且在截斷點之前未關閉的標記在截斷后立即關閉。
這比效率低truncatewords
,因此只能在傳遞HTML文本時使用。
57、unordered_list:遞歸地獲取自嵌套列表並返回一個HTML無序列表 - 無需打開和關閉<ul>標記
var = ['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']] {{ var|unordered_list }} #output <li>States <ul> <li>Kansas <ul> <li>Lawrence</li> <li>Topeka</li> </ul> </li> <li>Illinois</li> </ul> </li>
58、upper:將字符串轉換為全部大寫。
var = "run python manage migrate to apply them" {{ var|upper }} RUN PYTHON MANAGE MIGRATE TO APPLY THEM
59、urlencode:轉義在URL中使用的值。
var1 = "https://www.baidu.com/obj?a=b&b=d" <li>{{ var1|urlencode }}</li> <li>{{ var1|urlencode:"" }}</li> #當所有字符都應該轉義時可使用空字符串 #output: https%3A//www.baidu.com/obj%3Fa%3Db%26b%3Dd https%3A%2F%2Fwww.baidu.com%2Fobj%3Fa%3Db%26b%3Dd
60、urlize:將文本中的網址和電子郵件地址轉換為可點擊的鏈接。
<li>{{ "http://www.baidu.com"|urlize }}</li> <li>{{ "check out www.baidu.com"|urlize }}</li> <li>{{ "Send questions to foo@example.com"|urlize }}</li> #output http://www.baidu.com check out www.baidu.com Send questions to foo@example.com
61、urlizetrunc:將URL和電子郵件地址轉換為可點擊鏈接,就像urlize一樣,但會截斷超過給定字符數限制的URL。
<li>{{ "check out www.djangoproject.com more"|urlizetrunc:18 }}</li> #output check out www.djangoproje... more
62、wordcount:返回單詞的數量
<li>{{ "check out django project more"|wordcount }}</li> #output 5
63、wordwrap:用指定的行長包裝單詞。
{{ "django project more"|wordwrap:5 }}
64、yesno:將“true”、“false”和“可選”值映射到字符串“yes”、“否”、“可能”或以逗號分隔的列表傳遞的自定義映射,並根據值返回這些字符串中的一個字符串。
<li>{{ "True"|yesno:"yeah,no,maybe" }}</li> <li>{{ "False"|yesno:"yeah,no,maybe" }}</li>
國際化標簽和過濾器:
65、i18n:該庫允許在模板中指定可翻譯的文本。要啟用它,請設置USE_I18N
為True
,然后加載它 。{% loadi18n %}
66、l10n:該庫提供對模板中值的本地化的控制。您只需要使用庫加載庫,但通常會默認設置為使本地化處於活動狀態。{% load l10n %}
USE_L10N
True
67、tz:該庫提供對模板中時區轉換的控制。就像l10n
,你只需要使用庫加載,但通常也會設置為默認情況下轉換為本地時間。{% load tz %}
USE_TZ
True
其他標簽和過濾器庫:
Django附帶了一些其他模板標簽庫,您必須在INSTALLED_APPS
設置中明確啟用該模板庫,並在標簽中啟用模板。{% load %}
68、django.contrib.humanize:一組Django模板過濾器,可用於為數據添加“人體觸摸”。請參閱 django.contrib.humanize。
69、static:通過模板標簽鏈接到保存在STATIC_ROOT
Django中的靜態文件static
。如果django.contrib.staticfiles
安裝了應用程序,則標簽將使用url()
由指定的存儲方法提供文件STATICFILES_STORAGE
。
70、get_static_prefix:更多控制STATIC_URL
模板注入的位置和方式,則可以使用get_static_prefix
模板標簽
71、get_media_prefix:與此類似get_static_prefix
,get_media_prefix
使用媒體前綴填充模板變量MEDIA_URL