提示和技巧¶
文档的此部分展示了 Jinja 模板的一些提示和技巧。
Null 默认回退¶
Jinja 支持动态继承,并且只要未访问 extends
标记,就不会区分父模板和子模板。虽然这会导致一个令人惊讶的行为,即第一个 extends
标记之前的所有内容(包括空格)都会被打印出来,而不是被忽略,但它可以用于一个巧妙的技巧。
通常,子模板会从一个添加了基本 HTML 框架的模板中扩展。但是,可以将 extends
标记放入 if
标记中,以便仅在 standalone
变量评估为 false 时才从布局模板中扩展,如果未定义,则默认情况下为 false。此外,向文件中添加了一个非常基本的框架,以便如果确实使用 standalone
设置为 True
渲染,则会添加一个非常基本的 HTML 框架
{% if not standalone %}{% extends 'default.html' %}{% endif -%}
<!DOCTYPE html>
<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
可以接受无限数量的字符串。每次遇到此标记时,都会渲染列表中的下一项。
访问父循环¶
特殊的 loop
变量始终指向最内层的循环。如果希望访问外部循环,则可以对其进行别名
<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>