在學習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 %}處理空列表。

剛開始可能會覺得語法有點繞,但多寫幾次就能熟練掌握。後續我們還會講解條件判斷、過濾器等進階內容,現在先打好變量和循環的基礎吧!

小夜