如果你之前使用 Django 模板,你應(yīng)該會(huì)發(fā)現(xiàn)跟 Jinja2 非常相似。實(shí)際上, 很多的語(yǔ)法元素看起來相同,工作也相同。
盡管如此, Jinja2 提供了更多的在之前文檔中描述的語(yǔ)法元素,并且某些 工作會(huì)有一點(diǎn)不一樣。
本節(jié)介紹了模板差異。由于 API 是從根本上不同,我們不會(huì)再這里贅述。
在 Django 中,方法調(diào)用是隱式的。在 Jinja2 中,你必須指定你要調(diào)用一個(gè)對(duì)象。如 此,這段 Django 代碼:
{% for page in user.get_created_pages %}
...
{% endfor %}
在 Jinja 中應(yīng)該是這樣:
{% for page in user.get_created_pages() %}
...
{% endfor %}
這允許你給函數(shù)傳遞變量,且宏也使用這種方式,而這在 Django 中是不可能的。
在 Django 中你可以使用下面的結(jié)構(gòu)來判斷是否相等:
{% ifequal foo "bar" %}
...
{% else %}
...
{% endifequal %}
在 Jinja2 中你可以像通常一樣使用 if 語(yǔ)句和操作符來做比較:
{% if foo == 'bar' %}
...
{% else %}
...
{% endif %}
你也可以在模板中使用多個(gè) elif 分支:
{% if something %}
...
{% elif otherthing %}
...
{% elif foothing %}
...
{% else %}
...
{% endif %}
Jinja2 為過濾器提供不止一個(gè)參數(shù)。參數(shù)傳遞的語(yǔ)法也是不同的。一個(gè)這樣的 Django 模板:
{{ items|join:", " }}
在 Jinja2 中是這樣:
{{ items|join(', ') }}
實(shí)際上這有點(diǎn)冗贅,但它允許不同類型的參數(shù)——包括變量——且不僅是一種。
除過濾器外,同樣有用 is 操作符運(yùn)行的測(cè)試。這里是一些例子:
{% if user.user_id is odd %}
{{ user.username|e }} is odd
{% else %}
hmm. {{ user.username|e }} looks pretty normal
{% endif %}
因?yàn)檠h(huán)與 Django 中的十分相似,僅有的不兼容是 Jinja2 中循環(huán)上下文的特殊變 量名為loop?而不是 Django 中的?forloop?。
Jinja 中沒有?{%?cycle?%}?標(biāo)簽,因?yàn)樗请[式的性質(zhì)。而你可以用循環(huán)對(duì)象 的?cycle?方法實(shí)現(xiàn)幾乎相同的東西。
下面的 Django 模板:
{% for user in users %}
<li class="{% cycle 'odd' 'even' %}">{{ user }}</li>
{% endfor %}
Jinja 中看起來是這樣:
{% for user in users %}
<li class="{{ loop.cycle('odd', 'even') }}">{{ user }}</li>
{% endfor %}
沒有與?{%?cycle?...?as?variable?%}?等價(jià)的。
更多建議: