在學習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 %}處理空列表。
剛開始可能會覺得語法有點繞,但多寫幾次就能熟練掌握。後續我們還會講解條件判斷、過濾器等進階內容,現在先打好變量和循環的基礎吧!