- 論壇徽章:
- 0
|
模板標(biāo)簽和過(guò)濾器基礎(chǔ)
我們已經(jīng)提到模板系統(tǒng)使用內(nèi)建的標(biāo)簽和過(guò)濾器
這里我們看看常見(jiàn)的,附錄6包含了完整的內(nèi)建標(biāo)簽和過(guò)濾器,你自己熟悉那個(gè)列表來(lái)了解可以做什么是個(gè)好主意
if/else
{% if %}標(biāo)簽計(jì)算一個(gè)變量值,如果是“true”,即它存在、不為空并且不是false的boolean值
系統(tǒng)則會(huì)顯示{% if %}和{% endif %}間的所有內(nèi)容:
代碼
{% if today_is_weekend %} p>Welcome to the weekend!p> {% else %} p>Get back to work.p> {% endif %}
{% if %}標(biāo)簽接受and,or或者not來(lái)測(cè)試多個(gè)變量值或者否定一個(gè)給定的變量,例如:
代碼
{% if athlete_list and coach_list %} Both athletes and coaches are available. {% endif %} {% if not athlete_list %} There are no athletes. {% endif %} {% if athlete_list or coach_list %} There are some athletes or some coaches. {% endif %} {% if not athlete_list or coach_list %} There are no athletes or there are some coaches. {% endif %} {% if athlete_list and not coach_list %} There are some athletes and absolutely no coaches. {% endif %}
{% if %}標(biāo)簽不允許同一標(biāo)簽里同時(shí)出現(xiàn)and和or,否則邏輯容易產(chǎn)生歧義,例如下面的標(biāo)簽是不合法的:
代碼
{% if athlete_list and coach_list or cheerleader_list %}
如果你想結(jié)合and和or來(lái)做高級(jí)邏輯,只需使用嵌套的{% if %}標(biāo)簽即可:
代碼
{% if athlete_list %} {% if coach_list or cheerleader_list %} We have athletes, and either coaches or cheerleaders! {% endif %} {% endif %}
多次使用同一個(gè)邏輯符號(hào)是合法的:
代碼
{% if athlete_list or coach_list or parent_list or teacher_list %}
沒(méi)有{% elif %}標(biāo)簽,使用嵌套的{% if %}標(biāo)簽可以做到同樣的事情:
代碼
{% if athlete_list %} p>Here are the athletes: {{ athlete_list }}.p> {% else %} p>No athletes are available.p> {% if coach_list %} p>Here are the coaches: {{ coach_list }}.p> {% endif %} {% endif %}
確認(rèn)使用{% endif %}來(lái)關(guān)閉{% if %}標(biāo)簽,否則Django觸發(fā)TemplateSyntaxError
for
{% for %}標(biāo)簽允許你按順序遍歷一個(gè)序列中的各個(gè)元素
Python的for語(yǔ)句語(yǔ)法為for X in Y,X是用來(lái)遍歷Y的變量
每次循環(huán)模板系統(tǒng)都會(huì)渲染{% for %}和{% endfor %}之間的所有內(nèi)容
例如,顯示給定athlete_list變量來(lái)顯示athlete列表:
代碼
ul> {% for athlete in athlete_list %} li>{{ athlete.name }}li> {% endfor %} ul>
在標(biāo)簽里添加reversed來(lái)反序循環(huán)列表:
代碼
{% for athlete in athlete_list reversed %} ... {% endfor %} {% for %}標(biāo)簽可以嵌套: {% for country in countries %} h1>{{ country.name }}h1> ul> {% for city in country.city_list %} li>{{ city }}li> {% endfor %} ul> {% endfor %}
系統(tǒng)不支持中斷循環(huán),如果你想這樣,你可以改變你想遍歷的變量來(lái)使得變量只包含你想遍歷的值
類(lèi)似的,系統(tǒng)也不支持continue語(yǔ)句,本章后面的“哲學(xué)和限制”會(huì)解釋設(shè)計(jì)的原則
{% for %}標(biāo)簽內(nèi)置了一個(gè)forloop模板變量,這個(gè)變量含有一些屬性可以提供給你一些關(guān)于循環(huán)的信息
1,forloop.counter表示循環(huán)的次數(shù),它從1開(kāi)始計(jì)數(shù),第一次循環(huán)設(shè)為1,例如:
代碼
{% for item in todo_list %} p>{{ forloop.counter }}: {{ item }}p> {% endfor %}
2,forloop.counter0類(lèi)似于forloop.counter,但它是從0開(kāi)始計(jì)數(shù),第一次循環(huán)設(shè)為0
3,forloop.revcounter表示循環(huán)中剩下的items數(shù)量,第一次循環(huán)時(shí)設(shè)為items總數(shù),最后一次設(shè)為1
4,forloop.revcounter0類(lèi)似于forloop.revcounter,但它是表示的數(shù)量少一個(gè),即最后一次循環(huán)時(shí)設(shè)為0
5,forloop.first當(dāng)?shù)谝淮窝h(huán)時(shí)值為T(mén)rue,在特別情況下很有用:
代碼
{% for object in objects %} {% if forloop.first %}li class="first">{% else %}li>{% endif %} {{ object }} li> {% endfor %}
6,forloop.last當(dāng)最后一次循環(huán)時(shí)值為T(mén)rue
代碼
{% for link in links %}{{ link }}{% if not forloop.last %} | {% endif %}{% endfor %}
7,forloop.parentloop在嵌套循環(huán)中表示父循環(huán)的forloop:
代碼
{% for country in countries %} table> {% for city in country.city_list %} tr> td>Country #{{ forloop.parentloop.counter }} td> td>City #{{ forloop.counter }}td> td>{{ city }}td> tr> {% endfor %} table> {% endfor %}
富有魔力的forloop變量只能在循環(huán)中得到,當(dāng)模板解析器到達(dá){% endfor %}時(shí)forloop就消失了
如果你的模板context已經(jīng)包含一個(gè)叫forloop的變量,Django會(huì)用{% for %}標(biāo)簽替代它
Django會(huì)在for標(biāo)簽的塊中覆蓋你定義的forloop變量的值
在其他非循環(huán)的地方,你的forloop變量仍然可用
我們建議模板變量不要使用forloop,如果你需要這樣做來(lái)訪問(wèn)你自定義的forloop,你可以使用forloop.parentloop
ifequal/ifnotequal
Django模板系統(tǒng)并不是一個(gè)嚴(yán)格意義上的編程語(yǔ)言,所以它并不允許我們執(zhí)行Python語(yǔ)句
(我們會(huì)在‘哲學(xué)和限制‘一節(jié)詳細(xì)討論)。
然而在模板語(yǔ)言里比較兩個(gè)值并且在他們一致的時(shí)候顯示一些內(nèi)容,確實(shí)是一個(gè)在常見(jiàn)不過(guò)的需求了——所以Django提供了ifequal標(biāo)簽。
{% ifequal %}比較兩個(gè)值,如果相等,則顯示{% ifequal %}和{% endifequal %}之間的所有內(nèi)容:
代碼
{% ifequal user currentuser %} h1>Welcome!h1> {% endifequal %}
參數(shù)可以是硬編碼的string,單引號(hào)和雙引號(hào)均可,下面的代碼是合法的:
代碼
{% ifequal section 'sitenews' %} h1>Site Newsh1> {% endifequal %} {% ifequal section "community" %} h1>Communityh1> {% endifequal %}
和{% if %}一樣,{% ifequal %}標(biāo)簽支持{% else %}
代碼
{% ifequal section 'sitenews' %} h1>Site Newsh1> {% else %} h1>No News Hereh1> {% endifequal %}
其它的模板變量,strings,integers和小數(shù)都可以作為{% ifequal %}的參數(shù):
代碼
{% ifequal variable 1 %} {% ifequal variable 1.23 %} {% ifequal variable 'foo' %} {% ifequal variable "foo" %}
其它的Python類(lèi)型,如字典、列表或booleans不能硬編碼在{% ifequal %}里面,下面是不合法的:
代碼
{% ifequal variable True %} {% ifequal variable [1, 2, 3,]%} {% ifequal variable {'key': 'value'} %
如果你需要測(cè)試某個(gè)變量是true或false,用{% if %}即可
注釋
和HTML或編程語(yǔ)言如Python一樣,Django模板語(yǔ)言允許注釋{# #},如:
代碼
{# This is a comment #}
模板渲染時(shí)注釋不會(huì)輸出,一個(gè)注釋不能分成多行
下面的模板渲染時(shí)會(huì)和模板中的內(nèi)容一樣,注釋標(biāo)簽不會(huì)解析成注釋
This is a {# comment goes here
and spans another line #}
test.
過(guò)濾器
本章前面提到,模板過(guò)濾器是變量顯示前轉(zhuǎn)換它們的值的方式,看起來(lái)像下面這樣:
代碼
{{ name|lower }}
這將顯示通過(guò)lower過(guò)濾器過(guò)濾后{{ name }}變量的值,它將文本轉(zhuǎn)換成小寫(xiě)
使用(|)管道來(lái)申請(qǐng)一個(gè)過(guò)濾器
過(guò)濾器可以串成鏈,即一個(gè)過(guò)濾器的結(jié)果可以傳向下一個(gè)
下面是escape文本內(nèi)容然后把換行轉(zhuǎn)換成p標(biāo)簽的習(xí)慣用法:
代碼
{{ my_text|escape|linebreaks }}
有些過(guò)濾器需要參數(shù),需要參數(shù)的過(guò)濾器的樣子:
代碼
{{ bio|truncatewords:"30" }}
這將顯示bio標(biāo)量的前30個(gè)字,過(guò)濾器參數(shù)一直使用雙引號(hào)
下面是一些最重要的過(guò)濾器:
1,addslashed,在任何后斜線,單引號(hào),雙引號(hào)前添加一個(gè)后斜線
當(dāng)你把一些文本輸出到一個(gè)JavaScript字符串時(shí)這會(huì)十分有用
2,date,根據(jù)一個(gè)格式化string參數(shù)來(lái)格式化date或datetime對(duì)象,例如:
代碼
{{ pub_date|date:"F j, Y" }}
格式化string會(huì)在附錄6定義
3,escape,避免給定的string里出現(xiàn)and符,引號(hào),尖括號(hào)
當(dāng)你處理用戶提交的數(shù)據(jù)和確認(rèn)合法的XML和XHTML數(shù)據(jù)時(shí)這將很有用
escape將作如下的一些轉(zhuǎn)換:
代碼
Converts & to & Converts Converts > to > Converts "(雙引號(hào)) to " Converts '(單引號(hào)) to '
4,length,返回值的長(zhǎng)度,你可以在一個(gè)list或string上做此操作
或者在任何知道怎樣決定自己的長(zhǎng)度的Python對(duì)象上做此操作(即有一個(gè)__len__()方法的對(duì)象)
本文來(lái)自ChinaUnix博客,如果查看原文請(qǐng)點(diǎn):http://blog.chinaunix.net/u2/84280/showart_2066875.html |
|