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