从其他模板引擎切换

这是关于JJJA语法和其他模板语言之间的一些差异的简要指南。看见 模板设计器文档 有关JJJA语法和功能的全面指南,请参阅。

丹戈

如果您以前使用过Django模板,您应该会发现JJJA非常熟悉。许多语法元素看起来和工作起来都是一样的。但是,JJJA提供了一些更多的语法元素,并且一些元素的工作方式略有不同。

本节介绍模板更改。API,包括扩展支持,从根本上来说是不同的,所以这里不再讨论。

Django支持使用JJJA作为其模板引擎,请参阅https://docs.djangoproject.com/en/stable/topics/templates/#support-for-template-engines.

方法调用

在Django中,方法是隐式调用的,不带括号。

{% for page in user.get_created_pages %}
    ...
{% endfor %}

在JJJA中,调用时需要使用括号,就像在Python中一样。这允许您将变量传递给方法,这在Django中是不可能的。此语法也用于调用宏。

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

筛选参数

在Django中,一个文字值可以在冒号后面传递给筛选器。

{{ items|join:", " }}

在JJJA中,筛选器可以将任意数量的位置参数和关键字参数放在括号中,就像函数调用一样。参数也可以是变量,而不是文字值。

{{ items|join(", ") }}

测验

除了滤镜之外,JJJA还使用了 is 接线员。此运算符与Python运算符不同。

{% if user.user_id is odd %}
    {{ user.username|e }} is odd
{% else %}
    hmm. {{ user.username|e }} looks pretty normal
{% endif %}

循环

在Django中,循环上下文的特殊变量称为 forloop ,而 empty 用于无循环项。

{% for item in items %}
    {{ forloop.counter }}. {{ item }}
{% empty %}
    No items!
{% endfor %}

在JJJA中,循环上下文的特殊变量称为 loop ,而 else 块用于无循环项。

{% for item in items %}
    {{ loop.index }}. {{ item }}
{% else %}
    No items!
{% endfor %}

循环

在Django, {% cycle %} 可在for循环中使用,以在每个循环的值之间交替。

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

在金家, loop 上下文有一个 cycle 方法。

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

也可以将循环器赋给变量,并在循环外部或跨循环使用 cycle() 全局函数。

鲭鲨

您可以将JJJA配置为更像Mako:

env = Environment(
    block_start_string="<%",
    block_end_string="%>",
    variable_start_string="${",
    variable_end_string="}",
    comment_start_string="<%doc>",
    commend_end_string="</%doc>",
    line_statement_prefix="%",
    line_comment_prefix="##",
)

有了这样一个配置的环境,Jinsa应该能够解释Mako模板的一小部分,而不需要任何更改。

JJJA不支持嵌入式Python代码,因此您必须将其移出模板。您可以在渲染之前使用相同的代码处理数据,也可以向JJJA环境添加全局函数或过滤器。

Defs(在JJJA中称为宏)和模板继承的语法也不同。

以下是Mako模板:

<%inherit file="layout.html" />
<%def name="title()">Page Title</%def>
<ul>
% for item in list:
    <li>${item}</li>
% endfor
</ul>

在具有上述配置的JJJA中,如下所示:

<% extends "layout.html" %>
<% block title %>Page Title<% endblock %>
<% block body %>
<ul>
% for item in list:
    <li>${item}</li>
% endfor
</ul>
<% endblock %>