Django

如果你之前使用 Django 模板,你应该会发现跟 Jinja2 非常相似。实际上,很多的语法元素看起来相同,工作也相同。

尽管如此, Jinja2 提供了更多的在之前文档中描述的语法元素,并且某些工作会有一点不一样。

本节介绍了模板差异。由于 API 是从根本上不同,我们不会再这里赘述。

方法调用

在 Django 中,方法调用是隐式的。在 Jinja2 中,你必须指定你要调用一个对象。如此,这段 Django 代码:

  1. {% for page in user.get_created_pages %}
  2. ...
  3. {% endfor %}

在 Jinja 中应该是这样:

  1. {% for page in user.get_created_pages() %}
  2. ...
  3. {% endfor %}

这允许你给函数传递变量,且宏也使用这种方式,而这在 Django 中是不可能的。

条件

在 Django 中你可以使用下面的结构来判断是否相等:

  1. {% ifequal foo "bar" %}
  2. ...
  3. {% else %}
  4. ...
  5. {% endifequal %}

在 Jinja2 中你可以像通常一样使用 if 语句和操作符来做比较:

  1. {% if foo == 'bar' %}
  2. ...
  3. {% else %}
  4. ...
  5. {% endif %}

你也可以在模板中使用多个 elif 分支:

  1. {% if something %}
  2. ...
  3. {% elif otherthing %}
  4. ...
  5. {% elif foothing %}
  6. ...
  7. {% else %}
  8. ...
  9. {% endif %}

过滤器参数

Jinja2 为过滤器提供不止一个参数。参数传递的语法也是不同的。一个这样的Django 模板:

  1. {{ items|join:", " }}

在 Jinja2 中是这样:

  1. {{ items|join(', ') }}

实际上这有点冗赘,但它允许不同类型的参数——包括变量——且不仅是一种。

测试

除过滤器外,同样有用 is 操作符运行的测试。这里是一些例子:

  1. {% if user.user_id is odd %}
  2. {{ user.username|e }} is odd
  3. {% else %}
  4. hmm. {{ user.username|e }} looks pretty normal
  5. {% endif %}

循环

因为循环与 Django 中的十分相似,仅有的不兼容是 Jinja2 中循环上下文的特殊变量名为 loop 而不是 Django 中的 forloop

周期计

Jinja 中没有 {%cycle%} 标签,因为它是隐式的性质。而你可以用循环对象的 cycle 方法实现几乎相同的东西。

下面的 Django 模板:

  1. {% for user in users %}
  2. <li class="{% cycle 'odd' 'even' %}">{{ user }}</li>
  3. {% endfor %}

Jinja 中看起来是这样:

  1. {% for user in users %}
  2. <li class="{{ loop.cycle('odd', 'even') }}">{{ user }}</li>
  3. {% endfor %}

没有与 {%cycle…asvariable%} 等价的。