从其他模板引擎切换¶
这是关于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 %>