用兩個大括號括起來的文字(例如
{{ person_name }} )是
變量(variable)
被大括號和百分號包圍的文本(例如
{% if ordered_warranty %} )是
模板標簽(template tag) 。標簽(tag)定義比較明確,即:僅通知模板系統完成某些工作的標簽。
最后,這個模板的第二段落有一個
filter 過濾器的例子,它能讓你用來轉換變量的輸出,
在這個例子中,
{{ship_date|date:"F j, Y" }} 將變量
ship_date 用
date
過濾器來轉換,轉換的參數是
"F j, Y" .
date 過濾器根據指定的參數進行格式輸
出.過濾器是用管道字符(
| )來調用的,就和Unix管道一樣.
Template 類就在
django.template 模塊中
輸入命令
python manage.py shell 啟動交互界面
調用
Template 對象
的
render() 方法并傳遞context來填充模板
Python的字典數據類型就是關鍵字和它們值的一個映射。
Context 和字典很類似
注意到我們使用了三個引號來
標識這些文本,因為這樣可以包含多行。這是Python的一個語法。
Python列表類型的索引是從0開始的,第一個元素的索引是0,第二個是1,以此類推。
句點查找規則可概括為:當模板系統在變量名中遇到點時,按照以下順序嘗試進行查找:
在方法查找過程中,如果某方法拋出一個異常,除非該異常有一個
silent_variable_failure 屬性并且值為
True ,否則的話它將被傳播。如果該異常
確有 屬性
silent_variable_failure ,那么(所查找)變量將被渲染為空字符串
顯然,有些方法是有副作用的,好的情況下允許模板系統訪問它們可能只是干件蠢事,壞的情況下甚至會引發安全漏洞。
例如,你的一個
BankAccount 對象有一個
delete() 方法。不應該允許模板包含像
{{account.delete}} 這樣的方法調用。
要防止這樣的事情發生,必須設置該方法的
alters_data 函數屬性
{% if %} 標簽檢查(evaluate)一個變量,如果這個變量為真(即,變量存在,非空,不是布爾值假),系統會顯示在
{% if %} 和
{% endif %} 之間的任何內容
{% if %} 標簽接受
and ,
or 或者
not 關鍵字來對多個變量做判斷
,或者對變量取反(
not )
{% if %} 標簽不允許在同一個標簽中同時使用
and 和
or ,因為邏輯上可能模糊的
系統不支持用圓括號來組合比較操作
{% for %} 允許我們在一個序列上迭代。與Python的
for 語句的情形類似,循環語法是
for X in Y ,Y是要迭代的序列而X是在每一個特定的循環中使用的變量名稱
給標簽增加一個
reversed 使得該列表被反向迭代
Django不支持退出循環操作。如果我們想退出循環,可以改變正在迭代的變量,讓其僅僅包含需要迭代的項目
forloop.counter 總是一個表示當前循環的執行次數的整數計數器。這個計數器是從1開始的,所以在第一次循環時
forloop.counter 將會被設置為1
forloop.counter0 類似于
forloop.counter
forloop.revcounter 是表示循環中剩余項的整型變量
forloop.revcounter0 類似于
forloop.revcounter ,但它以0做為結束索引。
forloop.first 是一個布爾值。在第一次執行循環時該變量為True,在下面的情形中這個變量是很有用的。
forloop.last 是一個布爾值;在最后一次執行循環時被置為True。
forloop.parentloop 是一個指向當前循環的上一級循環的
forloop 對象的引用(在嵌套循環的情況下)
Django模板系統壓根兒就沒想過實現一個全功能的編程語言,所以它不允許我們在模板中執行Python的語句