1. 模板介紹 1.1 模板的功能 產生html,控制頁面上展示的內容。模板文件不僅僅是一個html文件。 模板文件包含兩部分內容: 靜態內容:css、js、html。 動態內容:用於動態去產生一些頁面內容。通過模板語言來產生。 1.2 模板文件的使用 通常是在視圖函數中使用模板產生html內容返回 ...
1. 模板介紹
1.1 模板的功能
產生html,控制頁面上展示的內容。模板文件不僅僅是一個html文件。
模板文件包含兩部分內容:
靜態內容:css、js、html。
動態內容:用於動態去產生一些頁面內容。通過模板語言來產生。
1.2 模板文件的使用
通常是在視圖函數中使用模板產生html內容返回給客戶端。
載入模板文件loader.get_template,獲取模板文件的內容,產生一個模板對象。
定義模板上下文RequeseContext,給模板文件傳遞數據。
模板渲染產生html頁面內容render,用傳遞的數據替換相應的變數,產生一個替換後的標準的html內容。
1.3 模板文件載入順序
首先去配置的模板目錄下麵去找模板文件。
去INSTALLED_APPS下麵的每個應用的templates去找模板文件,前提是應用中必須有templates文件夾。
2. 模板語言
2.1 變數
模板變數的作用是計算並輸出,變數名必須由字母、數字、下劃線(不能以下劃線開頭)和點組成。
語法如下:
{{變數}}
當模版引擎遇到點如book.title,會按照下列順序解析:
1.字典book['title']
2.先屬性後方法,將book當作對象,查找屬性title,如果沒有再查找方法title()
3.如果是格式為book.0則解析為列表book[0]
如果變數不存在則插入空字元串''。
在模板中調用方法時不能傳遞參數。
例如:
{{book.btitile}}
首先把book當成一個字典,把btitle當成鍵名,進行取值book['btitle']。
把book當成一個對象,把btitle當成屬性,進行取值book.btitle。
把book當成一個對象,把btitle當成對象的方法,進行取值book.btitle。
例如:
{{book.0}}
首先把book當成一個字典,把0當成鍵名,進行取值book[0]。
把book當成一個列表,把0當成下標,進行取值book[0]。
如果解析失敗,則產出內容時用空字元串填充模板變數。
使用模板變數時,前面的困難是一個字典,可能是一個對象,還可能是一個列表。
2.2 標簽
語法如下:
{%代碼段%}
for標簽語法如下:
{%for item in 列表%} 迴圈邏輯 {{forloop.counter}}表示當前是第幾次迴圈,從1開始 {%empty%} 列表為空或不存在時執行此邏輯 {%endfor%}
if標簽語法如下:
{%if ...%} 邏輯1 {%elif ...%} 邏輯2 {%else%} 邏輯3 {%endif%}
比較運算符如下:
運算符左右兩端不能緊挨變數或常量,必須有空格。
== != < > <= >=
布爾運算符如下:
and or not
2.3 過濾器
語法如下:
使用管道符號|來應用過濾器,用於進行計算、轉換操作,可以使用在變數、標簽中。
如果過濾器需要參數,則使用冒號:傳遞參數。
變數|過濾器:參數
長度length,返回字元串包含字元的個數,或列表、元組、字典的元素個數。
預設值default,如果變數不存在時則返回預設值。
data|default:'預設值'
日期date,用於對日期類型的值進行字元串格式化,常用的格式化字元如下:
Y表示年,格式為4位,y表示兩位的年。
m表示月,格式為01,02,12等。
d表示日, 格式為01,02等。
j表示日,格式為1,2等。
H表示時,24進位,h表示12進位的時。
i表示分,為0-59。
s表示秒,為0-59。
value|date:"Y年m月j日 H時i分s秒"
2.4 註釋
在模板中使用如下模板註釋,這段代碼不會被編譯,不會輸出到客戶端; html註釋只能註釋html內容,不能註釋模板語言。
單行註釋語法如下:
{#...#}
註釋可以包含任何模版代碼,有效的或者無效的都可以。
{# { % if foo % }bar{ % else % } #}
多行註釋使用comment標簽,語法如下:
{%comment%}
...
{%endcomment%}
3. 模板繼承
模板繼承和類的繼承含義是一樣的,主要是為了提高代碼重用,減輕開發人員的工作量。
典型應用:網站的頭部、尾部信息。
3.1 父模板
如果發現在多個模板中某些內容相同,那就應該把這段內容定義到父模板中。
標簽block:用於在父模板中預留區域,留給子模板填充差異性的內容,名字不能相同。 為了更好的可讀性,建議給endblock標簽寫上名字,這個名字與對應的block名字相同。父模板中也可以使用上下文中傳遞過來的數據。
{%block 名稱%}
預留區域,可以編寫預設內容,也可以沒有預設內容
{%endblock 名稱%}
3.2 子模板
標簽extends:繼承,寫在子模板文件的第一行。
{% extends "父模板路徑"%}
子模版不用填充父模版中的所有預留區域,如果子模版沒有填充,則使用父模版定義的預設值。
填充父模板中指定名稱的預留區域。
{%block 名稱%}
實際填充內容
{{block.super}}用於獲取父模板中block的內容
{%endblock 名稱%}
4. HTML轉義
模板對所有傳遞的文字進行輸出時,合併以下字元自動轉義。
小於號< 轉換為 <
大於號> 轉換為 >
單引號' 轉換為 '
雙引號" 轉換為 "
與符號& 轉換為 &
過濾器escape可以實現對變數的html轉義,預設模板就會轉義,一般省略。
{{t1|escape}}
過濾器safe:局部轉義,告訴模板這個變數是安全的,可以解釋執行。
{{data|safe}}
標簽autoescape:設置一段代碼都局部轉義,接受on,off參數。
{%autoescape off%}
...
{%endautoescape%}
模板硬編碼中的字元串預設不會經過轉義,如果需要轉義,那需要手動進行轉義。