Django模板(编写html代码
1.模板
?
- 用于編寫html代碼,還可以嵌入模板代碼更快更方便的完成頁面開發(fā),再通過在視圖中渲染模板,將生成最終的html字符串返回給客戶端瀏覽器
- 模版致力于表達(dá)外觀,一個(gè)視圖可以使用任意一個(gè)模板,一個(gè)模板可以供多個(gè)視圖使用
?
- 模板包含兩部分
- 靜態(tài)部分,包含html、css、js
- 動(dòng)態(tài)部分,就是模板語言
- Django處理模板分為兩個(gè)階段
- 1.加載:根據(jù)給定的路徑找到模板文件,編譯后放在內(nèi)存中
- 2.渲染:使用上下文數(shù)據(jù)對(duì)模板插值并返回生成的字符串
- 為了減少開發(fā)人員重復(fù)編寫加載、渲染的代碼,Django提供了簡(jiǎn)寫函數(shù)render,用于調(diào)用模板
?
?
2.模板語言
?
變量:{{變量}}
- 變量的作用是計(jì)算并輸出
- 變量名必須由字母、數(shù)字、下劃線(不能以下劃線開頭)和點(diǎn)組成
- 當(dāng)模版引擎遇到點(diǎn)如book.title,會(huì)按照下列順序解析:
- 1.字典book['title']
- 2.先屬性后方法,將book當(dāng)作對(duì)象,查找屬性title,如果沒有再查找方法title()
- 3.如果是格式為book.0則解析為列表book[0]
- 如果變量不存在則插入空字符串''
- 在模板中調(diào)用方法時(shí)不能傳遞參數(shù)
?
標(biāo)簽:{%代碼段%}
- for標(biāo)簽語法如下
{%for item in 列表%}
循環(huán)邏輯
{{forloop.counter}}表示當(dāng)前是第幾次循環(huán),從1開始
{%empty%}
列表為空或不存在時(shí)執(zhí)行此邏輯
{%endfor%}
- if標(biāo)簽語法如下
{%if ...%}
邏輯1
{%elif ...%}
邏輯2
{%else%}
邏輯3
{%endif%}
- 比較運(yùn)算符如下
- 注意:運(yùn)算符左右兩側(cè)不能緊挨變量或常量,必須有空格
==、!=、<、>、<=、>=
- 布爾運(yùn)算符:and、or、not
?
?
過濾器
- 語法:使用管道符號(hào)|來應(yīng)用過濾器,用于進(jìn)行計(jì)算、轉(zhuǎn)換操作,可以使用在變量、標(biāo)簽中
- 如果過濾器需要參數(shù),則使用冒號(hào):傳遞參數(shù)
變量|過濾器:參數(shù)
- 長(zhǎng)度length,返回字符串包含字符的個(gè)數(shù),或列表、元組、字典的元素個(gè)數(shù)
- 默認(rèn)值default,如果變量不存在時(shí)則返回默認(rèn)值
data|default:'默認(rèn)值'
- 日期date,用于對(duì)日期類型的值進(jìn)行字符串格式化,常用的格式化字符如下
- Y表示年,格式為4位,y表示兩位的年
- m表示月,格式為01,02,12等
- j表示日,格式為1,2等
- H表示時(shí),24進(jìn)制,h表示12進(jìn)制的時(shí)
- i表示分,為0-59
- s表示秒,為0-59
value|date:"Y年m月j日? H時(shí)i分s秒"
?
自定義過濾器
- 過濾器就是python中的函數(shù),注冊(cè)后就可以在模板中當(dāng)作過濾器使用
?
- 1.在應(yīng)用中創(chuàng)建templatetags目錄,當(dāng)前示例為”booktest/templatetags“,創(chuàng)建init文件,內(nèi)容為空
?
- 2.在”booktest/templatetags“目錄下創(chuàng)建filters.py文件,代碼如下
#coding=utf-8
#引入注冊(cè)對(duì)象
from django.template import Library
register=Library()
#使用裝飾器進(jìn)行注冊(cè)
@register.filter
#定義求余函數(shù)mod,將value對(duì)2求余
def mod(value):
??? return value%2
?
3.在templates/booktest/guolvqi.html中,使用自定義過濾器
- 4.首先使用load標(biāo)簽引入模塊:{%load filters%}
?
- 過濾器可以接收參數(shù),將booktest/templatetags/filters.py中增加mod_num函數(shù)
#使用裝飾器進(jìn)行注冊(cè)
@register.filter
#定義求余函數(shù)mod_num,將value對(duì)num求余
def mod_num(value,num):
??? return value%num
- 說明:只能額外傳遞一個(gè)參數(shù)
?
注釋
- 在模板中使用如下模板注釋,這段代碼不會(huì)被編譯,不會(huì)輸出到客戶端;html注釋只能注釋html內(nèi)容,不能注釋模板語言
- 單行注釋語法如下
{#...#}
- 注釋可以包含任何模版代碼,有效的或者無效的都可以
{# { % if foo % }bar{ % else %} #}
- 多行注釋使用comment標(biāo)簽,語法如下
{%comment%}
...
{%endcomment%}
?
?
3.模板繼承
- 模板繼承和類的繼承含義是一樣的,主要是為了提高代碼重用,減輕開發(fā)人員的工作量
- 典型應(yīng)用:網(wǎng)站的頭部、尾部信息
?
父模板
- 如果發(fā)現(xiàn)在多個(gè)模板中復(fù)制一段代碼,那就應(yīng)該把這段內(nèi)容定義到父模板中
- 標(biāo)簽block:用于在父模板中預(yù)留區(qū)域,留給子模板填充差異性的內(nèi)容,名字不能相同
- 為了更好的可讀性,建議給endblock標(biāo)簽寫上名字,這個(gè)名字與對(duì)應(yīng)的block名字相同
- 父模板中也可以使用上下文中傳遞過來的數(shù)據(jù)
{%block 名稱%}
預(yù)留區(qū)域,可以編寫默認(rèn)內(nèi)容,也可以沒有默認(rèn)內(nèi)容
{%endblock? 名稱%}
子模板
- 標(biāo)簽extends:繼承,寫在子模板文件的第一行
{% extends"父模板名稱"%}
- 子模版不用填充父模版中的所有預(yù)留區(qū)域,如果子模版沒有填充,則使用父模版定義的默認(rèn)值
- 填充父模板中指定名稱的預(yù)留區(qū)域
{%block 名稱%}
實(shí)際填充內(nèi)容
{{block.super}}用于獲取父模板中block的內(nèi)容
{%endblock 名稱%}
?
?
4.HTML轉(zhuǎn)義
- 模板對(duì)上下文傳遞的字符串進(jìn)行輸出時(shí),會(huì)對(duì)以下字符自動(dòng)轉(zhuǎn)義
小于號(hào)< 轉(zhuǎn)換為<
大于號(hào)> 轉(zhuǎn)換為>;
單引號(hào)' 轉(zhuǎn)換為'
雙引號(hào)" 轉(zhuǎn)換為 "
與符號(hào)& 轉(zhuǎn)換為 &
- 轉(zhuǎn)義后標(biāo)記代碼不會(huì)被直接解釋執(zhí)行,而是被直接呈現(xiàn),防止客戶端通過嵌入js代碼攻擊網(wǎng)站
?
關(guān)閉轉(zhuǎn)義
- 過濾器escape可以實(shí)現(xiàn)對(duì)變量的html轉(zhuǎn)義,默認(rèn)模板就會(huì)轉(zhuǎn)義,一般省略
{{t1|escape}}
- 過濾器safe:禁用轉(zhuǎn)義,告訴模板這個(gè)變量是安全的,可以解釋執(zhí)行
{{data|safe}}
?
- 標(biāo)簽autoescape:設(shè)置一段代碼都禁用轉(zhuǎn)義,接受on、off參數(shù)
{%autoescapeoff%}
...
{%endautoescape%}
?
?
5.CSRF
- CSRF全拼為Cross Site Request Forgery,譯為跨站請(qǐng)求偽造。CSRF指攻擊者盜用了你的身份,以你的名義發(fā)送惡意請(qǐng)求。CSRF能夠做的事情包括:以你名義發(fā)送郵件,發(fā)消息,盜取你的賬號(hào),甚至于購買商品,虛擬貨幣轉(zhuǎn)賬......造成的問題包括:個(gè)人隱私泄露以及財(cái)產(chǎn)安全。
- CSRF示意圖如下
- 如果想防止CSRF,首先是重要的信息傳遞都采用POST方式而不是GET方式,接下來就說POST請(qǐng)求的攻擊方式以及在Django中的避免
?
- 重要信息如金額、積分等,采用POST方式傳遞
防止CSRF兩種方式:
- 配置/settings.py中啟用csrf中間件即可
- 在form表單中加入標(biāo)簽csrf_token:{%csrf_token%}
總結(jié)
以上是生活随笔為你收集整理的Django模板(编写html代码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ts自动编译声明文件_拥抱 TS:细数选
- 下一篇: 怎么样才能更高效的学习区块链