說明:
本文主要深入瞭解模板(templates),主要涉及模板編寫步驟、定義模板、模板繼承、HTML轉義、CSRF等。
一、模板
動態生成HTML、表達外觀、實現業務邏輯(view)與顯示內容(template)的分離。
1、創建templates文件夾
在根目錄創建templates文件夾
2、模板處理
step1 加載:根據給定的標識找到模板然後預處理,通常會將它編譯好放在內存中:
step2 渲染:使用Context數據對模板插值並返回生成字符串:
或者使用快捷方式(代替 step1和step2):
二、定義模板
模板語言包括:
變量:{{ varible }}
標籤:{% 代碼塊 %}
過濾器:
註釋:{# 代碼或html #}
1、在模板中調用對象的方法
在models.py自定義類HeroInfo
在views.py中傳遞HeroInfo對象
在模板detail.html中調用
2、標籤:{% tag %}
for 標籤
{% for each in list %}
循環邏輯
{{ forloop.counter }}表示當前是第幾次循環(開始下標爲1)
{% empty %}
給出的列表不存在,執行此處
{% endfor %}
1 <!--【每頁的數據】--> 2 <ul> 3 {% for each in list %} 4 <li>{{each.btitle}}</li> 5 {% endfor %} 6 </ul>
if 標籤
{% if ... %}
邏輯1
{% elif ... %}
邏輯2
{% else %}
邏輯3
{% endif %}
1 <!--【頁碼鏈接】--> 2 {% for pindex in plist %} 3 {% if pIndex == pindex %} 4 {{pindex}} 5 {% else %} 6 <a href="/booktest/page{{pindex}}/" >{{pindex}}</a> 7 {% endif %} 8 {% endfor %}
comment 標籤
{% comment %}
多行註釋
{% endcomment %}
include:加載模板並以標籤內的參數渲染
{% include "foo/bar.html" %}
url:反向解析
{% url: 'name' p1 p2 %}
csrf_token:跨站請求僞造保護
{% csrf_token %}
布爾標籤:and\or, and比or優先級高
3、過濾器
語法:{{ 變量 | 過濾器 }}, 如{{ name | lower }} 表示變量name的值爲小寫輸出。
例子:
if list1 | length > 1 判斷列表的長度。
name | lower | upper 過濾器能夠被 “串聯”,構成過濾器鏈接。
list | join:", " 過濾器可傳遞參數,參數使用引號包起來。
value | dafaule:"空白" 如果一個變量沒有被提供,或者值爲false或空,則使用默認值,否則使用變量的值
value | date:"Y-m-d" 格式化輸出date變量
三、模板繼承
模板繼承主要爲了減少頁面內容重複定義,實現頁面內容的重用。
應用:網站的頭部、尾部都是一樣的,這些內容可以定義在父模板中,子模板不需要重複定義。
block標籤:在父摸板中預留的區域,在子模板可以定義在父模板中,子模板不需要重複定義。
extends:繼承、寫在模板文件的第一行。
例子1:
step1:定義父模板 base.html
step2:定義子模板 index.html
step3:在子模板中使用 block填充預留區域
四、HTML轉義
Django對字符串進行自動HTML轉義。
會被自動轉義的字符
HTML轉義:就是包含html標籤輸出,而不被解釋執行,原因是當用戶提交字符串時,可能包含一些攻擊性的代碼,如js腳本。
Django會將如下字符串自定轉義:
當顯示不被信任的變量時使用escape過濾器,一般省略,因爲django自動轉義:{{ t1 | escape }}
關閉轉義:
對於變量使用safe過濾器:{{ data | safe }}
對於代碼塊使用 autoescaoe標籤:
{% autoescape off %}
{{ body }}
{% endautoescape %}
標籤autoescape接受on或者off參數
自動轉義標籤在base模板中關閉,在children模板中也是關閉的。
字符串字面值
手動轉義:{{ data | default:"<b>123</b>" }} 應寫爲:{{ data | default:"<b>123</b>" }}