在学习Django Web开发时,模板引擎是将后端数据渲染到网页的关键工具。Django默认使用Jinja2作为模板引擎,它能让我们通过简洁的语法,将视图(View)传递过来的数据“注入”到HTML模板中。今天我们就来重点讲解Jinja2中最常用的变量和循环语法,让你快速上手模板渲染。
一、Jinja2模板引擎是什么?¶
简单来说,模板引擎就是把后端的数据(比如用户信息、列表、字典等)和HTML模板结合起来,生成最终能展示给用户的网页。举个例子:后端有个变量user_name = "小明",模板引擎会把{{ user_name }}替换成“小明”,最终显示在网页上。
二、变量语法:把数据“放”到模板里¶
在Jinja2中,变量通过双大括号{{ }}包裹,用来从后端视图中获取数据并展示。
1. 基础变量使用¶
假设我们在视图函数中准备了一些数据,然后传递到模板中。比如:
# 视图函数(views.py)示例
from django.shortcuts import render
def index(request):
# 传递不同类型的数据到模板
context = {
"name": "小明", # 字符串变量
"age": 20, # 数字变量
"is_student": True, # 布尔值变量
"hobbies": ["篮球", "编程", "音乐"] # 列表变量
}
return render(request, "index.html", context)
然后在模板文件index.html中,我们可以这样使用变量:
<!-- index.html 示例 -->
<!DOCTYPE html>
<html>
<head><title>我的信息</title></head>
<body>
<!-- 显示字符串变量 -->
<p>姓名:{{ name }}</p>
<!-- 显示数字变量 -->
<p>年龄:{{ age }}岁</p>
<!-- 显示布尔值变量(自动转换为文本) -->
<p>是否学生:{{ is_student }}</p>
<!-- 显示列表变量(需要循环,后面会讲) -->
<p>爱好:{{ hobbies }}</p> <!-- 直接显示列表 -->
</body>
</html>
这样渲染后,网页上会显示:
姓名:小明
年龄:20岁
是否学生:True
爱好:['篮球', '编程', '音乐']
2. 复杂数据类型:字典与嵌套结构¶
如果传递的是字典,Jinja2支持两种访问方式:点符号(.)或方括号([])。例如,视图中传递:
context = {
"user": {
"name": "小红",
"age": 18,
"address": {"city": "北京", "district": "海淀区"}
}
}
模板中使用:
<!-- 访问字典键值 -->
<p>用户姓名:{{ user.name }}</p> <!-- 点符号 -->
<p>用户地址:{{ user["address"]["city"] }}</p> <!-- 方括号嵌套 -->
渲染结果:
用户姓名:小红
用户地址:北京
3. 注意事项¶
- 变量未定义会报错:如果模板中使用了视图中没有传递的变量(比如
{{ email }}但email未在context中),Jinja2会抛出UndefinedError。可以通过{% if variable %}判断变量是否存在,或用default过滤器(后面简单提一下)。 - 避免直接修改变量:模板是“只读”的,不能在模板中直接修改变量(比如
{{ age = age + 1 }}是错误的),变量只能从视图中传递或通过过滤器转换。
三、循环语法:批量展示列表/字典数据¶
当需要展示多个数据(比如列表、字典列表)时,Jinja2提供{% for %}循环语法,配合{% endfor %}结束循环。
1. 基础循环示例¶
假设视图中传递了一个爱好列表:
context = {"hobbies": ["篮球", "编程", "音乐"]}
模板中循环展示:
<h3>我的爱好:</h3>
<ul>
{% for hobby in hobbies %} <!-- hobbies是视图传递的列表 -->
<li>{{ hobby }}</li> <!-- 循环输出每个爱好 -->
{% endfor %} <!-- 结束循环 -->
</ul>
渲染后网页上会显示:
我的爱好:
- 篮球
- 编程
- 音乐
2. 循环中的特殊变量:forloop¶
在循环过程中,Jinja2会自动创建forloop变量,包含循环的额外信息,常见用法:
- forloop.counter:从1开始的计数(比如第1个、第2个…)
- forloop.counter0:从0开始的计数
- forloop.first:判断是否为循环的第一个元素(布尔值)
- forloop.last:判断是否为循环的最后一个元素(布尔值)
示例:给列表项加序号,并标记第一个和最后一个元素
<ul>
{% for hobby in hobbies %}
<li>
序号:{{ forloop.counter }} <!-- 计数(1,2,3...) -->
- {{ hobby }}
{% if forloop.first %} <!-- 第一个元素特殊标记 -->
<span style="color: red;">(最喜欢的爱好)</span>
{% endif %}
</li>
{% endfor %}
</ul>
渲染后(假设hobbies有3个元素):
- 篮球(最喜欢的爱好)
- 编程
- 音乐
3. 处理空列表:{% empty %}¶
如果列表为空,循环会直接跳过,此时可以用{% empty %}显示默认提示:
<ul>
{% for hobby in hobbies %}
<li>{{ hobby }}</li>
{% empty %} <!-- 列表为空时执行 -->
<li>暂无爱好数据</li>
{% endfor %}
</ul>
4. 循环字典列表¶
如果需要循环字典列表(比如多个用户信息),可以这样写:
context = {
"users": [
{"name": "小红", "age": 18},
{"name": "小刚", "age": 22},
{"name": "小丽", "age": 20}
]
}
模板中循环:
<table border="1">
<tr>
<th>姓名</th>
<th>年龄</th>
</tr>
{% for user in users %}
<tr>
<td>{{ user.name }}</td>
<td>{{ user.age }}</td>
</tr>
{% endfor %}
</table>
四、总结¶
Jinja2的变量和循环是模板渲染的核心,掌握它们能让你轻松将后端数据展示到网页:
- 变量:用{{ 变量名 }}直接展示,支持字符串、数字、字典等多种类型。
- 循环:用{% for 变量 in 列表 %}遍历数据,配合forloop变量获取计数、首尾标记,用{% empty %}处理空列表。
刚开始可能会觉得语法有点绕,但多写几次就能熟练掌握。后续我们还会讲解条件判断、过滤器等进阶内容,现在先打好变量和循环的基础吧!