jinja2的语法结构
分隔符
1 | - {%...%}语句基本结构 |
1 | {# note: 多行注释 |
变量
支持字符串变量,列表、字典和对象
1 | {{ mydict['key'] }} |
过滤器
- safe 渲染时不转义
- capitalize 首字母大写
- lower 小写
- upper 大写
- title 每个单词的首字母都转换成大写
- trim 去掉首尾空格
- striptags 去掉值里的HTML标签
- default 设置一个默认值,如果变量未定义,就用这个默认值替换,
my_variable is not defined
判断语句
tests可以用来在语句里对变量或表达式进行测试,如果要测试一个变量,可以在变量后加上“is”和test名
1 | {% if user.age is equalto 42 %} {# 这里也可以写成... is equalto(42) #} |
常用的test
- defined
- equalto
- escaped
- none
- sequence
- string
- number
- reverse
- replace
循环取值
在for循环内,以下特殊变量可以直接使用
- loop.index 当前迭代数,可以用来写评论的楼层数(从1开始)
- loop.index0 同上,不过从0开始迭代
- loop.revindex 反向的迭代数(基数为1)
- loop.revindex0 反向的迭代数(基数为0)
- loop.length 序列的数量
- loop.first 是否是第一个元素
- loop.last 是否是最后一个元素
空格控制
- 默认情况下,末尾如果有换行符,直接去除
- 其他空格都原样保留
1 | <div> |
效果如下:1
2
3
4
5<div>
yay
</div>
注意:Jinja2语句占据的空行,你自己输出的空格,Tab都将保留。
如果需要删除,有两种方法来实现
设置jinja2的环境变量
1
2app.jinja_env.trim_blocks = True
app.jinja_env.lstrip_blocks = True手动添加一个减号(和%号之间没有空格)
1
2
3
4
5<div>
{% if True -%}
yay
{%- endif %}
</div>效果如下:
1
2
3<div>
yay
</div>如果要删除全部的空格
1
2
3
4
5<div>
{%- if True -%}
yay
{%- endif -%}
</div>效果如下:
1
<div>yay</div>
转义
- 小块内容直接用‘’来包裹,
{{
大块内容使用
raw
代码块1
2
3
4
5
6
7{% raw %}
<ul>
{% for item in seq %}
<li>{{ item }}</li>
{% endfor %}
</ul>
{% endraw %}
模板继承
一般情况下为了重复利用某些代码,创建一个base.html作为基模板,把导航栏、页脚、flash消息、js或css文件等等需要在每一个页面中显示的内容放在基模板里,并添加一个空的块用来放置其他子模板的内容:
block content %}{% endblock %}```
1
2
3
4
5
6
7 > 在其他的模板(子模板)里使用这个extends语句继承它,并放置相应的内容到基模板里定义过的空块:
> ```python
> {% extends "base.html" %}
{% block content %}
子模板的内容
{% endblock %}
>
如果想添加内容到在父模板内已经定义的块,可以使用super函数:
1
2
3
4
5
6
7 {% block sidebar %}
<h3>Table Of Contents</h3>
...
{{ super() }}
{% endblock %}
这样可以避免覆盖父块的内容。
>