控制语句
If语句
通过判断表达式的真假来决定输出哪一分支,语法关键字:if
、else
、elif
、endif
,if
和endif
是必须并且成对出现。
{% if price < 10 or always_show %}
Price is {{ price }}.
{% elif price > 1000 and not rich %}
That's expensive!
{% else %}
N/A
{% endif %}
未定义的变量被认为是假,所以在if语句中用来测试变量是否定义而不会引发错误。
{% if my_var %}
{{ my_var }}
{% else %}
Sorry, my_var isn't defined.
{% endif %}
For语句
循环列表中的没每一项,语法关键字:for
、endfor
,必须成对出现。
{% for product in products %}
{{loop.index}}. {{product.name}}
{% endfor %}
或者字符串中每一个字符
{% for letter in name %}
{% if loop.index % 2 == 0%}
<span style="color:red">{{ letter }}</span>
{% else %}
<span style="color:blue">{{ letter }}</span>
{% endif %}
{% endfor %}
循环体内预定义了对象变量loop
,有以下属性可用:
loop.index
:当前循环的次序,从1开始loop.index0
:当前循环的次序,从0开始loop.first
:是否为第一次循环loop.last
:是否为最后一次循环
Include语句
include语句可以包含其他模板,语法:include 模板路径
,路径始终从模板根目录开始查找,前面不能加 /
,暂不支持相对路径。
{% include "included.html" %}
路径可以是字符串表达式
{% include "partials/" ~ name ~ ".html" %}
被包含的模板:
- 共享当前的上下文数据
- 新赋值的变量,仅在其内有效
未找到模板时会报错,可以使用optional
关键字,在模板不存在时忽略。
{% include "header.html" optional %}
include语句支持路径列表,最先存在的模板被包含,其他忽略,同时支持optional
。
{% include ["custom/header.html", "header.html"] %}
{% include ["special_sidebar.html", "sidebar.html"] optional %}
Macros语句
宏可以认为是一种特殊的函数形式,其内部上下文通过参数传递,与外界隔离,宏的渲染输出作为整体返回。
{% macro input(label, type="text") %}
<label>
{{ label }}
<input type="{{type}}" />
</label>
{% endmacro input %}
其参数支持常量默认值。参数值可是有效变量、过滤器以及函数。
宏需要定义在一个单独的模板文件中,使用时导入并指定命名空间:
{% import "macros.html" as macros %}
调用形式如下:
{{ macros::input(label="Name", type="text") }}
宏定义文件中,当需要使用内部其他宏模块时,请使用self
命名空间,借助self
还可以实现递归调用,注意判断何时结束。
{% macro factorial(n) %}
{% if n > 1 %}{{ n }} - {{ self::factorial(n=n-1) }}{% else %}1{% endif %}
{% endmacro factorial %}
宏模块支持除block
, extends
外的所有语法。