Django5的模板系統是其核心功能之一,允許開發者將動態數據嵌入到HTML模板中,并根據不同的業務需求渲染頁面。Django模板系統基于 Django模板語言(DTL),它提供了一些強大的功能,如模板標簽、過濾器、條件語句和循環等,幫助開發者靈活地渲染和控制頁面內容。
本章將詳細介紹 Django5 的模板語言、模板標簽、過濾器及其自定義,幫助您深入理解如何在 Django 中使用模板系統。
5.1 Django5模板語言概述
Django 模板語言(DTL)是一種簡單、易學的語言,能夠有效地將動態內容注入到靜態HTML中。Django模板的基本結構包括以下幾個部分:
- 模板變量:用于顯示動態數據。
- 模板標簽:控制模板的邏輯(如條件語句、循環等)。
- 模板過濾器:用于修改變量的輸出內容。
5.2 模板變量
模板變量用 {{ }}?包裹,通常來自于視圖傳遞的數據。你可以在視圖函數中傳遞數據到模板,然后使用模板變量將數據展示出來。
5.2.1 模板變量示例
假設你有一個 User?模型,并想顯示用戶的名字和郵箱。
視圖函數:
from?django.shortcuts import?render
from?.models import?Userdef?user_profile(request, user_id):user = User.objects.get(id=user_id)return?render(request, 'user_profile.html', {'user': user})
模板:
<!DOCTYPE html>
<html><head><title>{{ user.username }}'s Profile</title></head><body><h1>Welcome, {{ user.username }}!</h1><p>Email: {{ user.email }}</p></body>
</html>
在這個例子中,{{ user.username }}?和 {{ user.email }}?是模板變量,模板引擎會將它們替換為 user?對象中的 username?和 email?字段的值。
5.3 模板標簽
模板標簽用于實現更復雜的功能,如條件判斷、循環等。標簽使用 {% %}?包裹。常用的模板標簽包括 if、for、block?等。
5.3.1 條件語句(if?標簽)
if?標簽用于根據條件執行不同的代碼塊。在模板中,if?標簽用于判斷條件是否成立,如果成立則執行相應的代碼。
條件語句示例:
{% if user.is_authenticated %}<p>Welcome back, {{ user.username }}!</p>
{% else %}<p>Please log in to access your profile.</p>
{% endif %}
在這個示例中,Django會檢查 user.is_authenticated?是否為 True,如果是,則顯示歡迎信息,否則提示用戶登錄。
5.3.2 循環語句(for?標簽)
for?標簽用于循環遍歷一個序列(如列表、字典等)。在模板中,常用的 for?標簽用于遍歷列表或查詢集。
循環語句示例:
<ul>{% for post in posts %}<li>{{ post.title }} - {{ post.created_at }}</li>{% empty %}<li>No posts available.</li>{% endfor %}
</ul>
在這個例子中,{% for post in posts %}?遍歷 posts?列表中的每個 post?對象,顯示文章的標題和創建時間。如果列表為空,則顯示 No posts available。
5.3.3 引入模板(include?標簽)
include?標簽允許在一個模板中嵌入另一個模板,通常用于重復的頁面結構,如頭部、腳部等。
引入模板示例:
{% include 'header.html' %}<h1>{{ title }}</h1>
{% include 'footer.html' %}
在這個例子中,header.html?和 footer.html?是獨立的模板文件,include?標簽將它們嵌入到當前模板中。
5.4 模板過濾器
模板過濾器用于修改變量的顯示方式。它們在模板變量后面用 |?分隔。例如,{{ value|lower }}?會將 value?變量轉換為小寫字母。
5.4.1 常見過濾器
date:格式化日期
<p>Published on: {{ post.created_at|date:"Y-m-d" }}</p>
default:如果變量為空,則使用默認值
<p>{{ user.bio|default:"This user has not updated their bio." }}</p>
length:返回一個列表或字符串的長度
<p>Number of posts: {{ posts|length }}</p>
lower:將字符串轉換為小寫
<p>{{ user.username|lower }}</p>
join:將列表元素連接成一個字符串
<p>{{ tags|join:", " }}</p>
5.4.2 自定義過濾器
Django 允許開發者創建自定義過濾器,以便在模板中使用。
自定義過濾器示例:
- 創建過濾器:
在 templatetags?目錄下創建一個 custom_filters.py?文件:
from?django import?templateregister = template.Library()@register.filter
def?add_suffix(value, suffix):return?f"{value}{suffix}"
加載并使用過濾器:
在模板中使用自定義過濾器之前,首先需要加載該過濾器:
{% load custom_filters %}<p>{{ user.username|add_suffix:"_profile" }}</p>
在這個例子中,add_suffix?過濾器會將用戶的用戶名添加一個后綴 "_profile"。
5.5 模板繼承與塊(Block)
模板繼承是 Django 模板系統的一個重要特性,它允許你創建一個基本的“框架”模板,并在子模板中插入特定內容。
5.5.1 基本模板(父模板)
父模板定義了網頁的基本結構,如頭部、導航欄、腳本等。使用 {% block %}?標簽定義可以被子模板覆蓋的部分。
父模板(base.html):
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>{% block title %}My Website{% endblock %}</title></head><body><header><h1>Welcome to My Website</h1></header><nav><a href="/">Home</a>?| <a href="/about">About</a></nav><main>{% block content %}Default content{% endblock %}</main><footer><p>??2023 My Website</p></footer></body>
</html>
5.5.2 子模板
子模板繼承自父模板,并覆蓋其中的塊部分。
子模板(home.html):
{% extends 'base.html' %}{% block title %}Home - My Website{% endblock %}{% block content %}<h2>Welcome to the home page!</h2><p>This is where the content goes.</p>{% endblock %}
通過 {% extends %}?和 {% block %}?標簽,子模板可以繼承父模板的結構,并定制其內容。
5.6 模板的性能優化
在 Django 項目中,模板渲染的性能非常重要,尤其是在高流量的 Web 應用中。以下是一些優化模板性能的方法:
緩存模板:使用 Django 的模板緩存機制,減少重復渲染的開銷。
{% load cache %}{% cache 600?sidebar %}<!-- 這里是需要緩存的內容 -->{% endcache %}
避免過多的循環和條件判斷:盡量避免在模板中進行復雜的計算和大量的循環。
靜態文件和媒體文件的優化:確保在模板中使用 static?標簽來引用靜態文件,并設置適當的緩存策略。
小結
本章深入介紹了 Django5 中的模板系統,包括模板變量、模板標簽、過濾器的使用,以及如何自定義過濾器。我們還講解了模板繼承和塊的概念,使得在大型項目中復用模板變得更加容易。通過有效的模板管理,Django5 提供了一個靈活、強大的系統來動態渲染和展示數據。