提示和技巧 — Jinja 文档
来自菜鸟教程
Jinja/docs/2.9.x/tricks
技巧和窍门
文档的这一部分展示了 Jinja2 模板的一些提示和技巧。
空主回退
Jinja2 支持动态继承,不区分父子模板,只要不访问 extends 标签。 虽然这会导致令人惊讶的行为,即第一个 extends 标签之前的所有内容(包括空格)都被打印出来而不是被忽略,但它可以用作一个巧妙的技巧。
通常子模板从添加基本 HTML 骨架的模板扩展而来。 但是,可以将 extends 标记放入 if 标记中,以便仅在 standalone 变量评估为 false 时才从布局模板扩展,如果它没有定义。 此外,一个非常基本的骨架被添加到文件中,因此如果它确实是在 standalone 设置为 True 的情况下渲染的,则会添加一个非常基本的 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 可以接受无限数量的字符串。 每次遇到此标记时,都会呈现列表中的下一项。
访问父循环
特殊的 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>