一程拭、變量
模板語(yǔ)法:
view:{"HTML變量名" : "views變量名"}
HTML:{{變量名}}
views.py 文件代碼:
from?django.shortcuts?import?render
def?runoob(request):
? ? ?views_name?=?"模板標(biāo)簽"
?????return?render(request,"runoob.html",?{"name":views_name})
templates 中的 runoob.html文件代碼 :
<p>{{ name }}</p>
再次訪(fǎng)問(wèn) http://127.0.0.1:8000/runoob寸五,可以看到頁(yè)面:
二招刹、列表
templates 中的 runoob.html中,可以用?.?索引下標(biāo)取出對(duì)應(yīng)的元素鱼炒。
views.py 文件代碼:
from?django.shortcuts?import?render
def?runoob(request):
????views_list?=?["模板標(biāo)簽1","模板標(biāo)簽2","模板標(biāo)簽3"]
????return?render(request,?"runoob.html",?{"views_list": views_list})
templates 中的 runoob.html文件代碼:
<p>{{ views_list }}</p>? ? # 取出整個(gè)列表
<p>{{ views_list.0 }}</p>? # 取出列表的第一個(gè)元素
三渠鸽、字典
templates 中的 runoob.html中读虏,可以用?.key 取出對(duì)應(yīng)的值。
views.py 文件代碼:
from?django.shortcuts?import?render
def?runoob(request):
????views_dict?=?{"name":"模板標(biāo)簽"}
????return?render(request,?"runoob.html",?{"views_dict": views_dict})
templates 中的 runoob.html文件代碼:
<p>{{ views_dict }}</p>
<p>{{ views_dict.name }}</p>
四墨缘、過(guò)濾器
模板語(yǔ)法:
{{ 變量名 | 過(guò)濾器:可選參數(shù) }}
模板過(guò)濾器可以在變量被顯示前修改它星虹,過(guò)濾器使用管道字符,如下所示:
{{ name | lower }}
{{ name }} 變量被過(guò)濾器 lower 處理后镊讼,文檔大寫(xiě)轉(zhuǎn)換文本為小寫(xiě)宽涌。
過(guò)濾管道可以被* 套接* ,既是說(shuō)狠毯,一個(gè)過(guò)濾器管道的輸出又可以作為下一個(gè)管道的輸入:
{{ my_list | first | upper }}? ? ?實(shí)例第一個(gè)元素將其轉(zhuǎn)化為大寫(xiě)护糖。
有些過(guò)濾器有參數(shù)。 過(guò)濾器的參數(shù)跟隨冒號(hào)之后并且總是以雙引號(hào)包含嚼松。 例如:
{{ bio | truncatewords:"30" }}? ??這個(gè)將顯示變量 bio 的前30個(gè)詞
其他過(guò)濾器:
addslashes : 添加反斜杠到任何反斜杠嫡良、單引號(hào)或者雙引號(hào)前面。
date : 按指定的格式字符串參數(shù)格式化 date 或者 datetime 對(duì)象献酗,格式?Y-m-d H:i:s 返回?年-月-日 小時(shí):分鐘:秒?的格式時(shí)間
{{ pub_date | date:"Y-m-d" }}
length :返回變量的長(zhǎng)度寝受,適用于字符串和列表。字典返回的是鍵值對(duì)的數(shù)量罕偎,集合返回的是去重后的長(zhǎng)度
default:為變量提供一個(gè)默認(rèn)值很澄。如果 views 傳的變量的布爾值是 false,則使用指定的默認(rèn)值颜及。
值為False:0甩苛、0.0、False俏站、0j讯蒲、""、[]肄扎、()墨林、set()、{}犯祠、None
{{ name | default:"默認(rèn)值False" }}
filesizeformat:以更易讀的方式顯示文件的大行竦取(即'13 KB', '4.1 MB', '102 bytes'等)。字典返回的是鍵值對(duì)的數(shù)量衡载,集合返回的是去重后的長(zhǎng)度
truncatechars:如果字符串包含的字符總個(gè)數(shù)多于指定的字符數(shù)量搔耕,那么會(huì)被截?cái)嗟艉竺娴牟糠帧=財(cái)嗟淖址畬⒁?...?結(jié)尾
safe:將字符串標(biāo)記為安全月劈,不需要轉(zhuǎn)義度迂。要保證 views.py 傳過(guò)來(lái)的數(shù)據(jù)絕對(duì)安全藤乙,才能用 safe。和后端 views.py 的 mark_safe 效果相同惭墓。Django 會(huì)自動(dòng)對(duì) views.py 傳到HTML文件中的標(biāo)簽語(yǔ)法進(jìn)行轉(zhuǎn)義坛梁,令其語(yǔ)義失效。加 safe 過(guò)濾器是告訴 Django 該數(shù)據(jù)是安全的腊凶,不必對(duì)其進(jìn)行轉(zhuǎn)義划咐,可以讓該數(shù)據(jù)語(yǔ)義生效。
views.py 文件代碼:
from?django.shortcuts?import?render
def?runoob(request):
????views_str?=?"<a
????return?render(request,?"runoob.html",?{"views_str": views_str})
runoob.html 文件代碼:
{{ views_str | safe }}
if/else:根據(jù)條件判斷是否輸出钧萍。if/else 支持嵌套褐缠。{% if %} 標(biāo)簽接受 and , or 或者 not 關(guān)鍵字來(lái)對(duì)多個(gè)變量做判斷 风瘦,或者對(duì)變量取反( not )队魏。
基本語(yǔ)法格式:
{% if condition1 %}?
?... display 1
{% elif condition2 %}?
?... display 2
{% else %}?
?... display 3
{% endif %}
for:{% for %} 允許我們?cè)谝粋€(gè)序列上迭代,與 Python 的 for 語(yǔ)句的情形類(lèi)似,循環(huán)語(yǔ)法是 for X in Y ,Y 是要迭代的序列而 X 是在每一個(gè)特定的循環(huán)中使用的變量名稱(chēng)良瞧,每一次循環(huán)中,模板系統(tǒng)會(huì)渲染在?{% for %}?和?{% endfor %}?之間的所有內(nèi)容昧谊。
<ul>
{% for i in views_list %}
????????<li>{{ i }}</li>
{% endfor %}
</ul>
給標(biāo)簽增加一個(gè) reversed 使得該列表被反向迭代:
{% for i in views_list reversed%}
{{ i }}
{% endfor %}
可以直接用字典?.items?方法遍歷字典,用變量的解包分別獲取鍵和值:
{% for i,j in views_dict.items %}
{{ i }} {{ j }}
{% endfor %}
在 {% for %} 標(biāo)簽里可以通過(guò) {{forloop}} 變量獲取循環(huán)序號(hào):
forloop.counter: 順序獲取循環(huán)序號(hào)酗捌,從 1 開(kāi)始計(jì)算
forloop.counter0: 順序獲取循環(huán)序號(hào)呢诬,從 0 開(kāi)始計(jì)算
forloop.revcounter: 倒敘獲取循環(huán)序號(hào),結(jié)尾序號(hào)為 1
forloop.revcounter0: 倒敘獲取循環(huán)序號(hào)胖缤,結(jié)尾序號(hào)為 0
forloop.first(一般配合if標(biāo)簽使用): 第一條數(shù)據(jù)返回 True尚镰,其他數(shù)據(jù)返回 False
forloop.last(一般配合if標(biāo)簽使用): 最后一條數(shù)據(jù)返回 True,其他數(shù)據(jù)返回 False
{% for i in listvar %}
? ? {{ forloop.counter }}
? ? {{ forloop.counter0 }}
? ? {{ forloop.revcounter }}
? ? {{ forloop.revcounter0 }}
? ? {{ forloop.first }}
? ? {{ forloop.last }}
{% endfor %}
可選的 {% empty %} 從句:在循環(huán)為空的時(shí)候執(zhí)行(即 in 后面的參數(shù)布爾值為 False )哪廓。
{% for i in listvar %}? #?listvar為空
? ? {{ forloop.counter0 }}
{% empty %}
? ? 空空如也~
{% endfor %}
可以嵌套使用 {% for %} 標(biāo)簽钓猬。
ifequal/ifnotequal :{% ifequal %} 標(biāo)簽比較兩個(gè)值,當(dāng)他們相等時(shí)撩独,顯示在 {% ifequal %} 和 {% endifequal %} 之中所有的值,和 {% if %} 類(lèi)似
{% ifequal section 'sitenews' %}? # 如果section==?'sitenews'账月,返回Site News
?????<h1>Site News</h1>
{% else %}?
????<h1>No News Here</h1>
{% endifequal %}
注釋標(biāo)簽:Django 注釋使用 {# #}
include :{% include %} 標(biāo)簽允許在模板中包含其它的模板的內(nèi)容综膀。
{% include "nav.html" %}
csrf_token:csrf_token 用于form表單中,作用是跨站請(qǐng)求偽造保護(hù)局齿。如果不用{% csrf_token %}標(biāo)簽剧劝,在用 form 表單時(shí),要再次跳轉(zhuǎn)頁(yè)面會(huì)報(bào)403權(quán)限錯(cuò)誤抓歼。用了{% csrf_token %}標(biāo)簽讥此,在 form 表單提交數(shù)據(jù)時(shí)拢锹,才會(huì)成功。
解析:
首先萄喳,向服務(wù)器發(fā)送請(qǐng)求卒稳,獲取登錄頁(yè)面,此時(shí)中間件 csrf 會(huì)自動(dòng)生成一個(gè)隱藏input標(biāo)簽他巨,該標(biāo)簽里的 value 屬性的值是一個(gè)隨機(jī)的字符串充坑,用戶(hù)獲取到登錄頁(yè)面的同時(shí)也獲取到了這個(gè)隱藏的input標(biāo)簽。
然后染突,等用戶(hù)需要用到form表單提交數(shù)據(jù)的時(shí)候捻爷,會(huì)攜帶這個(gè) input 標(biāo)簽一起提交給中間件 csrf,原因是 form 表單提交數(shù)據(jù)時(shí)份企,會(huì)包括所有的 input 標(biāo)簽也榄,中間件 csrf 接收到數(shù)據(jù)時(shí),會(huì)判斷司志,這個(gè)隨機(jī)字符串是不是第一次它發(fā)給用戶(hù)的那個(gè)甜紫,如果是,則數(shù)據(jù)提交成功俐芯,如果不是棵介,則返回403權(quán)限錯(cuò)誤。