這部分文檔展示了一些 Jinja2 模板的提示和技巧。
Jinja2 支持動態(tài)繼承并且只要沒有 extends 標(biāo)簽被訪問過,就不分辨父模板和子模 板。而這會導(dǎo)致令人驚訝的行為:首個 extends 標(biāo)簽前的包括空白字符的所有東西 會被打印出來而不是被忽略,這也可以用作一個巧妙的方法。
通常,繼承一個模板的子模板來添加基本的 HTML 骨架。而把 extends 標(biāo)簽放在 if 標(biāo)簽中,當(dāng) standalone 變量值為 false 時(按照默認未定義也為 false )繼 承布局模板是可行的。此外,一個非常基本的骨架會被添加到文件,這樣如果確實帶 置為 True 的 standalone 渲染,一個非?;镜?HTML 骨架會被添加:
{% if not standalone %}{% extends 'master.html' %}{% endif -%}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<title>{% block title %}The Page Title{% endblock %}</title>
<link rel="stylesheet" href="style.css" type="text/css">
{% block body %}
<p>This is the page body.</p>
{% endblock %}
如果你想要對一個表格或列表中的每行使用不同的樣式,可以使用 loop 對象的 cycle 方法:
<ul>
{% for row in rows %}
<li class="{{ loop.cycle('odd', 'even') }}">{{ row }}</li>
{% endfor %}
</ul>
cycle 可接受無限數(shù)目的字符串。每次遭遇這個標(biāo)簽,列表中的下一項 就會被渲染。
你經(jīng)常想要一個帶有活動導(dǎo)航項的導(dǎo)航欄。這相當(dāng)容易實現(xiàn)。因為在 block 外 的聲明在子模板中是全局的,并且在布局模板求值前執(zhí)行,在子模板中定義活動的 菜單項:
{% extends "layout.html" %}
{% set active_page = "index" %}
布局模板之后就可以訪問 active_page 。此外,這意味著你可以為它定義默認 值:
{% set navigation_bar = [
('/', 'index', 'Index'),
('/downloads/', 'downloads', 'Downloads'),
('/about/', 'about', 'About')
] -%}
{% set active_page = active_page|default('index') -%}
...
<ul id="navigation">
{% for href, id, caption in navigation_bar %}
<li{% if id == active_page %} class="active"{% endif
%}><a href="{{ href|e }}">{{ caption|e }}</a>/li>
{% endfor %}
</ul>
...
特殊的 loop 變量總是指向最里層的循環(huán)。如果想要訪問外層的循環(huán),可以給它 設(shè)置別名:
<table>
{% for row in table %}
<tr>
{% set rowloop = loop %}
{% for cell in row %}
<td id="cell-{{ rowloop.index }}-{{ loop.index }}>{{ cell }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>