jinja2的语法结构

jinja2的语法结构

分隔符

1
2
3
4
- {%...%}语句基本结构
- {{...}}打印模板的输出,大括号和里面的值都要保持一个空格
- {#...#}注释
- #...##行语句,用来注释用
1
2
3
4
5
{# note: 多行注释
{% for user in users %}
...
{% endfor %}
#}

变量

支持字符串变量,列表、字典和对象

1
2
3
4
5
6
7
{{ mydict['key'] }}
{{ mylist[3] }}
{{ mylist[myintvar] }}
{{ myobj.somemethod() }}
# 以下等效
{{ foo.bar }}
{{ foo['bar'] }}

过滤器

  • safe 渲染时不转义
  • capitalize 首字母大写
  • lower 小写
  • upper 大写
  • title 每个单词的首字母都转换成大写
  • trim 去掉首尾空格
  • striptags 去掉值里的HTML标签
  • default 设置一个默认值,如果变量未定义,就用这个默认值替换,my_variable is not defined

判断语句

tests可以用来在语句里对变量或表达式进行测试,如果要测试一个变量,可以在变量后加上“is”和test名

1
2
3
{% if user.age is equalto 42 %} {# 这里也可以写成... is equalto(42) #}
Ha, you are 42!
{% endif %}

常用的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
2
3
4
5
<div>
{% if True %}
yay
{% endif %}
</div>

效果如下:

1
2
3
4
5
<div>

yay

</div>

注意:Jinja2语句占据的空行,你自己输出的空格,Tab都将保留。
如果需要删除,有两种方法来实现

  1. 设置jinja2的环境变量

    1
    2
    app.jinja_env.trim_blocks = True
    app.jinja_env.lstrip_blocks = True
  2. 手动添加一个减号(和%号之间没有空格)

    1
    2
    3
    4
    5
    <div>
    {% if True -%}
    yay
    {%- endif %}
    </div>

    效果如下:

    1
    2
    3
    <div>
    yay
    </div>
  3. 如果要删除全部的空格

    1
    2
    3
    4
    5
    <div>
    {%- if True -%}
    yay
    {%- endif -%}
    </div>

    效果如下:

    1
    <div>yay</div>

转义

  1. 小块内容直接用‘’来包裹,{{
  2. 大块内容使用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 %}
这样可以避免覆盖父块的内容。
>

详细信息