1. 安装
可以使用 pip
来安装 Jinja2:
pip install Jinja2
2. 基本使用
Jinja2 的基本使用步骤通常包括以下几个部分:
- 导入
Environment
和FileSystemLoader
。 - 创建一个模板环境对象。
- 加载模板文件。
- 渲染模板。
以下是一个简单的示例:
from jinja2 import Environment, FileSystemLoader
# 创建一个模板环境对象,指定模板文件所在的目录
env = Environment(loader=FileSystemLoader('templates'))
# 加载模板文件
template = env.get_template('hello.html')
# 定义要传递给模板的数据
data = {'name': 'John'}
# 渲染模板
output = template.render(data)
# 打印渲染后的结果
print(output)
假设 templates
目录下有一个 hello.html
文件,内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>
3. 语法
变量
在 Jinja2 中,使用双花括号 {{ }}
来表示变量。例如:
<p>My name is {{ name }}.</p>
在渲染模板时,{{ name }}
会被实际传递的 name
变量的值替换。
注释
使用 {# #}
来添加注释,注释不会出现在渲染后的结果中。例如:
{# 这是一个注释 #}
<p>这是一段文本。</p>
语句
使用 {% %}
来表示语句,用于控制模板的逻辑。例如:
{% if age >= 18 %}
<p>你已经成年了。</p>
{% else %}
<p>你还未成年。</p>
{% endif %}
4. 过滤器
过滤器用于对变量进行格式化或转换。过滤器使用管道符号 |
来应用到变量上。以下是一些常用的过滤器:
upper
和 lower
将字符串转换为大写或小写:
<p>{{ name|upper }}</p>
<p>{{ name|lower }}</p>
length
返回列表、字符串等的长度:
<p>列表的长度是 {{ my_list|length }}</p>
default
如果变量为 None
或空值,使用默认值:
<p>{{ name|default('Guest') }}</p>
5. 控制结构
if
语句
用于条件判断:
{% if age >= 18 %}
<p>你已经成年了。</p>
{% elif age >= 12 %}
<p>你是青少年。</p>
{% else %}
<p>你是儿童。</p>
{% endif %}
for
循环
用于遍历列表、字典等可迭代对象:
<ul>
{% for item in my_list %}
<li>{{ item }}</li>
{% endfor %}
</ul>
如果要遍历字典,可以使用 items()
方法:
<dl>
{% for key, value in my_dict.items() %}
<dt>{{ key }}</dt>
<dd>{{ value }}</dd>
{% endfor %}
</dl>
6. 继承和包含
模板继承
Jinja2 支持模板继承,允许你创建一个基础模板,然后在其他模板中继承并扩展它。基础模板使用 {% block %}
定义可替换的块:
<!-- base.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}默认标题{% endblock %}</title>
</head>
<body>
<header>
<h1>网站标题</h1>
</header>
<main>
{% block content %}
<p>默认内容</p>
{% endblock %}
</main>
<footer>
<p>版权所有 © 2025</p>
</footer>
</body>
</html>
子模板使用 {% extends %}
继承基础模板,并使用 {% block %}
覆盖相应的块:
<!-- child.html -->
{% extends 'base.html' %}
{% block title %}新标题{% endblock %}
{% block content %}
<p>这是新的内容。</p>
{% endblock %}
模板包含
使用 {% include %}
可以在一个模板中包含另一个模板:
<!-- main.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>主页面</title>
</head>
<body>
{% include 'header.html' %}
<main>
<p>主内容</p>
</main>
{% include 'footer.html' %}
</body>
</html>