以下内容是 Django 类基于视图(CBV) 探究系列的 第六篇,主要介绍如何通过 TemplateView 和 RedirectView 自动化 简单页面渲染 和 重定向处理。如果您在上一篇文章(第五篇)中使用 CreateView
、UpdateView
和 DeleteView
构建了 CRUD,那这次我们将探讨如何更有效地配置 简易 页面及 重定向处理。
上一篇文章链接如下,请点击查看!
使用 CreateView、UpdateView、DeleteView 实现 CRUD
“通过 Django 的 TemplateView 和 RedirectView
轻松自动化简单页面结构和重定向!”
1. TemplateView & RedirectView,为什么需要?
TemplateView 和 RedirectView 是 Django 中专注于最简单用途的类基于视图(通用视图)。
-
TemplateView
-
在没有特殊数据处理逻辑的情况下,将静态页面或 简单的上下文 传递给模板时非常有用。
-
例如:“关于”页面,“常见问题”页面,404/500等错误页面(如果进行了单独设置)。
-
-
RedirectView
-
用于将用户立即 重定向到特定 URL。
-
例如:当访问域名根 (
/
) 时重定向到特定页面,简单的短网址服务,宣传活动的重定向等。
-
这两个视图专注于无需数据库操作或表单验证的 简单 页面处理,与之前讨论的 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 在创建不需要数据库查询的简单页面时特别有用,
另一方面,如果多个模板需要公共变量,可以考虑结合使用 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 案例
-
通知页面: 想要展示内容固定的静态页面时,可以使用
TemplateView
,而无需数据库结合。 -
常见问题 / ‘即将推出’页面: 快速展示产品常见问题或临时维护页面等时也很有用。
-
域名根重定向: 可以使用
RedirectView
自动化类似“访问主页时重定向到 /home/”的简单重定向逻辑。 -
外部服务链接连接: 类似于短网址,当访问特定路径时重定向到外部网站也适用。
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. 总结与下篇预告
TemplateView 和 RedirectView 是帮助 Django 项目轻松管理 最简单页面处理 的类基于视图。
当不需要数据库结合或表单验证等复杂逻辑时,使用它们可以 减少重复代码,并 保持项目结构 更加干净。
现在我们已经能够使用 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 自动化繁琐的静态页面处理和重定向,
使项目更加简洁高效!”
目前没有评论。