在学习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 %}处理空列表。

刚开始可能会觉得语法有点绕,但多写几次就能熟练掌握。后续我们还会讲解条件判断、过滤器等进阶内容,现在先打好变量和循环的基础吧!

小夜