以下内容是 Django 类基于视图(CBV) 探究系列的 第六篇,主要介绍如何通过 TemplateViewRedirectView 自动化 简单页面渲染重定向处理。如果您在上一篇文章(第五篇)中使用 CreateViewUpdateViewDeleteView 构建了 CRUD,那这次我们将探讨如何更有效地配置 简易 页面及 重定向处理

上一篇文章链接如下,请点击查看!

使用 CreateView、UpdateView、DeleteView 实现 CRUD


“通过 Django 的 TemplateView 和 RedirectView
轻松自动化简单页面结构和重定向!”


1. TemplateView & RedirectView,为什么需要?

TemplateViewRedirectView 是 Django 中专注于最简单用途的类基于视图(通用视图)。

  1. TemplateView

    • 在没有特殊数据处理逻辑的情况下,将静态页面简单的上下文 传递给模板时非常有用。

    • 例如:“关于”页面,“常见问题”页面,404/500等错误页面(如果进行了单独设置)。

  2. RedirectView

    • 用于将用户立即 重定向到特定 URL

    • 例如:当访问域名根 (/) 时重定向到特定页面,简单的短网址服务,宣传活动的重定向等。

这两个视图专注于无需数据库操作或表单验证的 简单 页面处理,与之前讨论的 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 在创建不需要数据库查询的简单页面时特别有用,

  • 另一方面,如果多个模板需要公共变量,可以考虑结合使用 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 与 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. 常见问题 / ‘即将推出’页面: 快速展示产品常见问题或临时维护页面等时也很有用。

  3. 域名根重定向: 可以使用 RedirectView 自动化类似“访问主页时重定向到 /home/”的简单重定向逻辑。

  4. 外部服务链接连接: 类似于短网址,当访问特定路径时重定向到外部网站也适用。


6. 与 FBV 的对比

功能 FBV(函数基于视图) TemplateView / RedirectView(类基于视图)
静态页面渲染(例如:常见问题) 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 函数 -> 可能产生重复” “节省时间(Time-saving)、代码一致性、维护性(Productivity boost)”

7. 总结与下篇预告

TemplateViewRedirectView 是帮助 Django 项目轻松管理 最简单页面处理 的类基于视图。
当不需要数据库结合或表单验证等复杂逻辑时,使用它们可以 减少重复代码,并 保持项目结构 更加干净。

现在我们已经能够使用 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 自动化繁琐的静态页面处理和重定向,
使项目更加简洁高效!”