以下文章是 Django 類別基礎視圖(CBV)探究系列的 第六篇,將介紹如何通過 TemplateViewRedirectView 自動化簡單的頁面渲染重定向處理。在前一篇文章(第五篇)中,我們使用 CreateViewUpdateViewDeleteView 構建了 CRUD,而這次我們將探討如何更有效率地構建 輕量級 的頁面及 重定向處理

前一篇的直接鏈接請點擊以下鏈接!

使用 CreateView、UpdateView、DeleteView 實現 CRUD


“通過 Django TemplateView 和 RedirectView
輕鬆自動化簡單的頁面結構和重定向!”


1. TemplateView & RedirectView,為什麼需要?

TemplateViewRedirectView 是專為最簡單用途而設計的 Django 類別基礎視圖(Generic Views)。

  1. TemplateView

    • 在無需特別數據處理邏輯的情況下,將靜態頁面簡單的上下文傳遞給模板時非常有用。

    • 例如:“關於”頁面、“常見問題”頁面、404/500等錯誤頁面(如果另有設置)等。

  2. RedirectView

    • 用於直接將用戶重定向(移動)至特定網址。

    • 例如:當訪問域名根(/)時重定向至特定頁面、簡單的短網址服務、活動促銷用重定向等。

這兩者著重於無需數據庫操作或表單驗證的簡單頁面處理,與之前討論的 FormViewCreateView 等性質不同。


2. TemplateView 的使用方法

TemplateView 流程圖 – HTML 自動渲染

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 中傳遞上下文數據

RedirectView – 自動右轉的智能重定向

除了基本的模板渲染外,當我們想要向模板傳遞簡單變量時,可以重寫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_titledescription 這兩個變量:

<!-- 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 的案例

  1. 公告頁面: 想不需要數據庫連動,顯示公告內容的固定靜態頁面時,可以使用 TemplateView

  2. 常見問題 / “即將推出”頁面: 在快速顯示產品 FAQ 或臨時維護頁面時也非常有用。

  3. 域名根重定向: 可以使用 RedirectView 自動化“訪問主頁時重定向至 /home/”這樣簡單的重定向邏輯。

  4. 外部服務鏈接連接: 在訪問特定路徑時像短網址一樣重定向至外部網站。


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. 總結與下一篇預告

TemplateViewRedirectView 是幫助 Django 項目輕鬆管理最簡單頁面處理的類別基礎視圖。
在不需要 DB 聯動或表單驗證等複雜邏輯的情況下,使用它們可以減少重複代碼,並保持項目結構更加簡潔。

現在我們已經能夠用 CBV 實現“靜態頁面”、“重定向”、“CRUD(創建 / 修改 / 刪除)”、“列表 / 詳情展示”、“表單處理”等
大多數網頁開發的必要元素

在下一篇(系列第七篇)中,我們將介紹在 Django 中如何利用Mixin來簡單重用共通功能,並有效實現權限管理登錄檢查的方法。


回顧之前的文章

  1. 類別基礎視圖(CBV)探究系列 #1 – 為什麼從 FBV 轉向 CBV 與開發者的態度
  2. 類別基礎視圖(CBV)探究系列 #2 – 理解 Django 的基本視圖類別
  3. 類別基礎視圖(CBV)探究系列 #3 – 使用 FormView 簡化表單處理
  4. 類別基礎視圖(CBV)探究系列 #4 – ListView & DetailView 的使用方法
  5. 類別基礎視圖(CBV)探究系列 #5 – 使用 CreateView、UpdateView、DeleteView 實現 CRUD

“通過 TemplateView 和 RedirectView 自動化繁瑣的靜態頁面處理與重定向,讓
項目變得更簡潔與高效!”