1.变量
2.1节中的模板文件user.html的{{ name }}就是一个变量,形式如一种占位符,而真实的数据只有在程序临时的上下文中获取。
Jinja2能识别所有类型的变量,甚至一些复杂的类型,例如列表、字典和对象。示例如下:{{ mylist[1] }},{{ mydict[‘name’] }},{{ myobj.to_do() }}。
同时,Jinja2支持使用过滤器修改变量,过滤器添加在变量后面,中间用竖线分割,例如将变量name的首字母大写:
Hello, {{ name|capitalize }}
Jinja2提供的部分常用过滤器有:
过滤器 | 说明 |
---|---|
capitalize | 把值的首字母变成大写,其他字母变成小写 |
lower | 把字母全部变成小写 |
upper | 把字母全部变成大写 |
title | 把值中每个单词的首字母都变成大写 |
trim | 把值的首尾空格去掉 |
striptags | 渲染之前把值中所有的HTML标签都删掉 |
safe | 渲染时不转义 |
safe 过滤器值得特别说明一下。默认情况下,出于安全考虑,Jinja2 会转义所有变量。例如,如果一个变量的值为 ‘<h1>Hello, everyone.<h1>’,Jinja2 会将其渲染成 ‘<h1>Hello, everyone.</h1>’ ,浏览器能显示这个 h1 元素,但不会进行解释。很多情况下需要显示变量中存储的 HTML 代码,这时就可使用 safe 过滤器。
2.控制结构
JInja2提供了多种控制结构,用来改变模板的渲染过程。
下面例如展示:条件控制
{% if user %}
Hello, {{ user }}.
{% else %}
Hello, stranger.
{% endif %}
下面例如展示:渲染一组元素
<ul>
{% for comment in comments %}
<li>{{ comment }}</li>
{% endfor %}
</ul>
Jinja2还支持宏,宏类似于python中的函数:
!<-- 创建宏 -->
{% macro render_comment(comment) %}
<li>{{ comment }}</li>
{% endmacro %}
<ul>
{% for comment in comments %}
!<-- 使用宏 -->
{{ render_comment(comment) }}
{% endfor %}
</ul>
为了重复使用宏,我们可以把它保存在单独的文件中,需要时再导入:
{% import 'macros.html' as macros %}
<ul>
{% for comment in comments %}
!<-- 使用宏 -->
{{ macros.render_comment(comment) }}
{% endfor %}
</ul>
在日常开发模板中,我们经常会使用到重复的代码。为了避免多份文件都有同样的代码片段,我们需要把重复使用的模板代码写入单独的文件,然后在需要的文件开头包含include:
{% include 'common.html' %}
解决重复使用代码的另一种方法是模板继承,它类似于python中的类继承。首先,我们要创建一个名为base.html的基模板:
<html>
<head>
{% block head %}
<title>{% block title %}{% endblock %} - My Application</title>
{% endblock %}
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
block标签定义的元素可在衍生模板中修改。在base.html中,定义了head、title和body的块,然后衍生模板index.html继承基模板base.html:
{% extends "base.html" %}
{% block title %}Index Page{% endblock %}
{% block head %}
{{ super() }}
<style>
</style>
{% endblock %}
{% block body %}
<h1>Hello, everyone.</h1>
{% endblock %}
extends指令声明这个模板衍生自base.html,而且基模板中的3个块被重新定义,模板引擎会将其插入合适的位置。注意:新定义的head块,因为基模板中block head内容不是空的,所以用super()获取原来的内容。