以下文章是 Django 類別基礎視圖(CBV)探究系列的 第六篇,將介紹如何通過 TemplateView 和 RedirectView 自動化簡單的頁面渲染和重定向處理。在前一篇文章(第五篇)中,我們使用 CreateView
、UpdateView
、DeleteView
構建了 CRUD,而這次我們將探討如何更有效率地構建 輕量級 的頁面及 重定向處理。
前一篇的直接鏈接請點擊以下鏈接!
使用 CreateView、UpdateView、DeleteView 實現 CRUD
“通過 Django TemplateView 和 RedirectView
輕鬆自動化簡單的頁面結構和重定向!”
1. TemplateView & RedirectView,為什麼需要?
TemplateView 和 RedirectView 是專為最簡單用途而設計的 Django 類別基礎視圖(Generic Views)。
-
TemplateView
-
在無需特別數據處理邏輯的情況下,將靜態頁面或簡單的上下文傳遞給模板時非常有用。
-
例如:“關於”頁面、“常見問題”頁面、404/500等錯誤頁面(如果另有設置)等。
-
-
RedirectView
-
用於直接將用戶重定向(移動)至特定網址。
-
例如:當訪問域名根(
/
)時重定向至特定頁面、簡單的短網址服務、活動促銷用重定向等。
-
這兩者著重於無需數據庫操作或表單驗證的簡單頁面處理,與之前討論的 FormView
、CreateView
等性質不同。
2. TemplateView 的使用方法
2.1 基本結構
# views.py
from django.views.generic import TemplateView
class HomePageView(TemplateView):
template_name = 'home.html'
-
template_name
: 指定要渲染的模板文件路徑。 -
即使不重寫
get()
方法,系統也會在基本上響應 GET 請求時自動渲染指定於template_name
的模板。
2.2 urls.py 的連接
# urls.py
from django.urls import path
from .views import HomePageView
urlpatterns = [
path('', HomePageView.as_view(), name='home'),
]
- 訪問根 URL(
""
)將顯示home.html
模板。
2.3 模板示例: home.html
<!DOCTYPE html>
<html>
<head>
<title>首頁</title>
</head>
<body>
<h1>你好!這裡是首頁。</h1>
</body>
</html>
3. 在 TemplateView 中傳遞上下文數據
除了基本的模板渲染外,當我們想要向模板傳遞簡單變量時,可以重寫get_context_data()
方法。
from django.views.generic import TemplateView
class AboutPageView(TemplateView):
template_name = 'about.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['page_title'] = '關於我們'
context['description'] = '本網站是為了介紹 Django CBV 的示例。'
return context
那麼在模板中,可以使用 page_title
和 description
這兩個變量:
<!-- about.html -->
<!DOCTYPE html>
<html>
<head>
<title>{{ page_title }}</title>
</head>
<body>
<h1>{{ page_title }}</h1>
<p>{{ description }}</p>
</body>
</html>
提示:
TemplateView 特別適合用於創建不需要 DB 查詢的簡單頁面,
如果多個模板需要共用變量,可以考慮結合Mixin或基模板的方式。
4. RedirectView 使用方法
4.1 基本結構
# views.py
from django.views.generic import RedirectView
class BlogRedirectView(RedirectView):
pattern_name = 'blog_list' # URL 名稱
# (選擇性) 可以指定 URL 反向時所需的參數
# query_string = True # 保持查詢字符串
# permanent = False # 永久重定向(301 vs 302)
-
pattern_name
: 指定urls.py
中的 URL 名稱(例如:'blog_list'
),在執行視圖時將重定向至該路徑。 -
如果設為
permanent=True
,則將執行永久重定向(301),默認為(False
)則為臨時重定向(302)。 -
設為
query_string=True
時,將保留原 URL 的查詢字符串(?page=2
等),並附加到重定向的目標 URL。
4.2 urls.py 的連接
# urls.py
from django.urls import path
from .views import BlogRedirectView, HomePageView
urlpatterns = [
path('go-to-blog/', BlogRedirectView.as_view(), name='go_to_blog'),
path('', HomePageView.as_view(), name='home'),
]
- 訪問
/go-to-blog/
將重定向到規定的'blog_list'
URL 模式。
4.3 直接指定 URL
也可以不使用 URL 名稱,而是將絕對路徑或外部鏈接直接放在url
屬性中。
class ExternalRedirectView(RedirectView):
url = 'https://www.djangoproject.com/'
urlpatterns = [
path('django-home/', ExternalRedirectView.as_view(), name='django_home'),
]
- 這樣將導致
/django-home/
→https://www.djangoproject.com/
的重定向。
5. TemplateView & RedirectView 的案例
-
公告頁面: 想不需要數據庫連動,顯示公告內容的固定靜態頁面時,可以使用
TemplateView
。 -
常見問題 / “即將推出”頁面: 在快速顯示產品 FAQ 或臨時維護頁面時也非常有用。
-
域名根重定向: 可以使用
RedirectView
自動化“訪問主頁時重定向至 /home/”這樣簡單的重定向邏輯。 -
外部服務鏈接連接: 在訪問特定路徑時像短網址一樣重定向至外部網站。
6. 與 FBV 比較
功能 | FBV (函數基礎視圖) | TemplateView / RedirectView (類別基礎視圖) |
---|---|---|
靜態頁面渲染(例如:FAQ) | def faq(request): return render(request, 'faq.html') 等直接編寫 |
TemplateView: 只需指定 template_name 即可自動渲染頁面 |
簡單重定向 | return redirect('some_url') / HttpResponseRedirect(...) 使用 |
RedirectView: 僅需指定 URL 或 pattern_name 。 |
傳遞額外上下文 | 每次 context = {...} -> render(...) 直接處理 |
通過get_context_data() 可以結構化且一致地管理。 |
代碼結構 / 維護 | 短頁面或簡單重定向使用 FBV 沒有問題,但有很多靜態頁面或重定向會導致重複。 | |
開發生產力(核心關鍵詞) | “直接使用 render,redirect 函數 -> 可能存在重複” | “節省時間、代碼一致性、便於維護!” |
7. 總結與下一篇預告
TemplateView 和 RedirectView 是幫助 Django 項目輕鬆管理最簡單頁面處理的類別基礎視圖。
在不需要 DB 聯動或表單驗證等複雜邏輯的情況下,使用它們可以減少重複代碼,並保持項目結構更加簡潔。
現在我們已經能夠用 CBV 實現“靜態頁面”、“重定向”、“CRUD(創建 / 修改 / 刪除)”、“列表 / 詳情展示”、“表單處理”等
大多數網頁開發的必要元素!
在下一篇(系列第七篇)中,我們將介紹在 Django 中如何利用Mixin來簡單重用共通功能,並有效實現權限管理或登錄檢查的方法。
回顧之前的文章
- 類別基礎視圖(CBV)探究系列 #1 – 為什麼從 FBV 轉向 CBV 與開發者的態度
- 類別基礎視圖(CBV)探究系列 #2 – 理解 Django 的基本視圖類別
- 類別基礎視圖(CBV)探究系列 #3 – 使用 FormView 簡化表單處理
- 類別基礎視圖(CBV)探究系列 #4 – ListView & DetailView 的使用方法
- 類別基礎視圖(CBV)探究系列 #5 – 使用 CreateView、UpdateView、DeleteView 實現 CRUD
“通過 TemplateView 和 RedirectView 自動化繁瑣的靜態頁面處理與重定向,讓
項目變得更簡潔與高效!”
目前沒有評論。