提示和技巧

文档的这一部分显示了Jinja2模板的一些提示和技巧。

空主回退

jinja2支持动态继承,只要不支持,就不区分父模板和子模板 extends 已访问标记。虽然这导致了令人惊讶的行为 extends 包含空白的标签被打印出来,而不是被忽略,它可以用于一个整洁的技巧。

通常,子模板从一个添加基本HTML框架的模板扩展而来。但是可以把 extends 标签进入 if 标记仅从布局模板扩展,如果 standalone 变量的计算结果为false,如果未定义,则默认为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 %}

交替行

如果要对表或列表的每一行使用不同的样式,可以使用 cycle 方法在 loop 对象:

<ul>
{% for row in rows %}
  <li class="{{ loop.cycle('odd', 'even') }}">{{ row }}</li>
{% endfor %}
</ul>

cycle

突出显示活动菜单项

通常您希望有一个带有活动导航项的导航栏。这真的很容易实现。因为工作分配超出 block 子模板中的是全局的,在评估布局模板之前执行。可以在子模板中定义活动菜单项::

{% 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 变量总是指向最里面的循环。如果希望访问外部循环,可以将其别名为:

<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>