通往 Django 大师之路:最大限度提高网站开发效率的 16 种通用视图
你好,充满激情 Django 嘿,开发人员!今天我们有一个非常激动人心的话题。我们将深入探讨 "16 种通用视图"。
众所周知,使用 Django 进行网络开发有时会因为代码重复而令人沮丧,但不用担心,一旦掌握了 Django 的通用视图,这些问题就会迎刃而解。
在这篇文章中,我们将深入介绍 Django 的 16 个通用视图,并通过实际代码示例了解如何使用它们。 我们将保持足够简单,让初学者和中级用户都能理解,所以请跟紧我们!

Django 通用视图的魔力:掌握 16 种视图
Django 中的泛型视图是一种神奇的工具,它抽象了 Web 开发中常用的模式,大大提高了开发人员的工作效率。 掌握这 16 种泛型视图将使您的 Django 开发技能更上一层楼。 让我们逐一了解它们。
本表提供了 Django 的 16 个通用视图的概览,简要说明了每个视图的分类、名称和主要功能,以帮助您了解通用视图的整体结构和目的。
| 对通用视图进行分类 | 通用视图名称 | 视图的功能(作用 |
|---|---|---|
| 底座视图 | 查看 | 默认视图类,根据 HTTP 方法进行处理 |
| 底座视图 | 模板查看 | 渲染指定模板 |
| 底座视图 | 重定向视图 | 重定向到另一个 URL |
| 通用显示视图 | 列表视图 | 显示对象列表 |
| 通用显示视图 | 详细查看 | 显示单个对象的详细信息 |
| 通用编辑视图 | 表格视图 | 表格处理 |
| 通用编辑视图 | 创建查看 | 创建新对象 |
| 通用编辑视图 | 更新查看 | 修改现有对象 |
| 通用编辑视图 | 删除视图 | 删除对象 |
| 通用日期视图 | 档案索引视图 | 按日期显示最新对象列表 |
| 通用日期视图 | 年份存档视图 | 显示特定年份的物品列表 |
| 通用日期视图 | 月份存档视图 | 显示特定月份的对象列表 |
| 通用日期视图 | 周档案视图 | 显示特定关注对象列表 |
| 通用日期视图 | DayArchiveView | 显示特定日期的对象列表 |
| 通用日期视图 | 今日存档查看 | 显示今天日期的对象列表 |
| 通用日期视图 | DateDetailView | 显示特定日期的对象详细信息 |
1.视图:一切从这里开始
View 是所有基于类的视图的基类。让我们通过一个简单的例子来看看如何使用 View。
从 django.views 导入 View
from django.http import HttpResponse
class MyView(View):
def get(self, request):
return HttpResponse('Hello, Django world!')
def post(self, request):
return HttpResponse('POST Request.')代码评注:
- 从 django.views.View 中导入 View 类。
- 导入 HttpResponse,以便返回 HTTP 响应。
- 定义 MyView 类并从 View 类继承。
- 定义一个 get 方法来处理 GET 请求。
- 定义 post 方法来处理 POST 请求。
在这个简单的示例中,你可以看到 View 类的强大功能,对吗? 你可以根据 HTTP 方法轻松实现其他逻辑。
2. TemplateView:静态页面的动力源泉
TemplateView 用于简单地渲染模板。它对于创建不需要动态数据处理的静态页面非常有用。
从 django.views.generic 导入 TemplateView
class HomePageView(TemplateView):
template_name = "home.html"
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['welcome_message'] = "欢迎来到 Django"。
返回上下文代码评注:
- Import TemplateView from django.views.generic.
- 定义一个 HomePageView 类并继承自 TemplateView。
- 设置 template_name 属性以指定要使用的模板。
- 重载 get_context_data 方法以传递额外的上下文数据。
- 调用 super() 获取默认上下文数据。
- 使用 "welcome_message "键为上下文添加欢迎信息。
这将导致 "home.html "模板使用 {{ welcome_message }}来显示欢迎信息。很简单吧?
3. RedirectView:移动 URL 向导
RedirectView 用于将用户重定向到不同的 URL。它对于缩短 URL 或将旧 URL 重定向到新 URL 非常有用。
从 django.views.generic 导入 RedirectView
类 OldUrlRedirectView(RedirectView):
url = '/new-awesome-page/'
permanent = True代码评注:
- 从 django.views.generic.RedirectView 导入 RedirectView。
- 定义 OldUrlRedirectView 类并继承自 RedirectView。
- 设置 url 属性,指定要重定向到的目标 URL。
- 将 permanent 设置为 True,以使用永久重定向 (301)。
使用该视图,您可以自动将访问过期 URL 的用户引导到新页面。这不仅有利于搜索引擎优化,还能改善用户体验!
4. ListView:列表显示的冠军
ListView 是一种用于显示对象列表的通用视图。它对于创建博客文章列表或产品目录等非常有用。
从 django.views.generic 导入 ListView
从 .models import Book
类 BookListView(ListView):
model = Book
template_name = "book_list.html
context_object_name = 'books' 上下文对象名称
paginate_by = 10
def get_queryset(self):
return Book.objects.filter(is_published=True).order_by('-publication_date')代码评注:
- 从 django.views.generic.ListView 导入一个 ListView。
- 导入要使用的模型(图书)。
- 定义类 BookListView 并继承自 ListView。
- 设置模型属性以指定要使用的模型。
- 以 template_name 指定要使用的模板。
- 用 context_object_name 指定模板中要使用的对象列表名称。
- 使用 paginate_by 设置每页显示的对象数量。
- 重载 get_queryset 方法以返回自定义查询集。
通过该视图,您可以显示已出版图书的列表,按最新图书排序,并标注页码。很方便吧?
5.DetailView:细节大师
DetailView 用于显示单个对象的详细信息。例如,在为特定博文或产品创建详情页时,这就非常有用。
从 django.views.generic 导入 DetailView
从 .models import Book
类 BookDetailView(DetailView):
model = Book
template_name = "book_detail.html
context_object_name = "book
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['related_books'] = Book.objects.filter(author=self.object.author).exclude(pk=self.object.pk)[:3]
返回 context代码评注:
- 从 django.views.generic.View 导入一个 DetailView。
- 导入要使用的模型(图书)。
- 定义一个 BookDetailView 类并继承自 DetailView。
- 设置模型、模板名称和上下文对象名称属性。
- 重载 get_context_data 方法,以提供额外的上下文数据。
- 添加同一作者的其他相关书籍(最多 3 本)。
通过该视图,您可以显示一本书的详细信息以及其他相关书籍。这是改善用户体验的绝佳方式!
6. FormView:表单处理向导
FormView 是一种用于处理表单的通用视图。在需要接收和处理用户数据时,它非常有用。
从 django.views.generic 导入 FormView
from django.urls import reverse_lazy
从 .forms 导入 ContactForm
类 ContactFormView(FormView):
template_name = "contact.html
form_class = ContactForm
success_url = reverse_lazy('contact_success')
def form_valid(self, form):
form.send_email()
return super().form_valid(form)代码评注:
- 从 django.views.generic.FormView 导入 FormView。
- 导入 reverse_lazy 函数,以轻松评估 URL 解除引用。
- 导入要使用的表单类 (ContactForm)。
- 定义 ContactFormView 类并继承自 FormView。
- 设置 template_name、form_class 和 success_url 属性。
- 重载 form_valid 方法,以定义表单有效时的行为。
- 调用表单的 send_email 方法发送电子邮件。
该视图可轻松处理联系表单。如果表单有效,我们会发送电子邮件并重定向到成功页面。
7.创建视图:对象创建向导
CreateView 是用于创建新对象的通用视图。例如,您可以用它来创建新博文或添加新产品。
从 django.views.generic 导入 CreateView
从 django.urls 导入 reverse_lazy
从 .models 导入 Book
类 BookCreateView(CreateView):
模型 = Book
fields = ['title', 'author', 'description', 'publication_date'] 字段
template_name = "book_form.html
success_url = reverse_lazy('book-list')
def form_valid(self, form):
form.instance.created_by = self.request.user
return super().form_valid(form)代码评注:
- 从 django.views.generic.CreateView 导入 CreateView。
- 导入 reverse_lazy 函数和图书模型。
- 定义 BookCreateView 类并从 CreateView 继承。
- 设置模型、字段、模板名称和 success_url 属性。
- 重载 form_valid 方法,以定义表单有效时的行为。
- 将当前登录的用户设置为图书的创建者。
该视图允许将新书添加到数据库中。提交表单后,它会自动将当前登录的用户设置为图书的创建者,并将其重定向到图书列表页面。
8. UpdateView:修改对象向导
UpdateView 是一种通用视图,用于修改现有对象。它对于编辑博客文章或更新产品信息非常有用。
从 django.views.generic 导入 UpdateView
从 django.urls 导入 reverse_lazy
从 .models 导入 Book
类 BookUpdateView(UpdateView):
model = Book
fields = ['title', 'author', 'description', 'publication_date'] 字段
template_name = "book_update.html
def get_success_url(self):
return reverse_lazy('book-detail', kwargs={'pk': self.object.pk})
def form_valid(self, form):
form.instance.updated_by = self.request.user
return super().form_valid(form)代码评注:
- Import UpdateView from django.views.generic.
- 导入 reverse_lazy 函数和图书模型。
- 定义 BookUpdateView 类并继承自 UpdateView。
- 设置模型、字段和模板名称属性。
- 重载 get_success_url 方法,动态生成成功 URL。
- 在 form_valid 方法中,将当前用户设置为更新后的用户。
使用该视图可以轻松编辑现有图书信息。 完成编辑后,您将被重定向到图书的详细页面。很方便吧?
9. DeleteView:删除对象的高手
DeleteView 是用于删除对象的通用视图。它对删除不必要的数据非常有用。
从 django.views.generic 导入 DeleteView
从 django.urls 导入 reverse_lazy
从 django.contrib.auth.mixins import UserPassesTestMixin
from .models import Book
类 BookDeleteView(UserPassesTestMixin, DeleteView):
model = Book
template_name = "book_confirm_delete.html
success_url = reverse_lazy('book-list')
def test_func(self):
return self.request.user.is_staff 或 self.get_object().created_by == self.request.user代码评注:
- Import DeleteView from django.views.generic.
- 导入 UserPassesTestMixin 以执行权限检查。
- 定义一个 BookDeleteView 类,并从 UserPassesTestMixin、DeleteView 继承。
- 设置模型、模板名称和 success_url 属性。
- 重载 test_func 方法以检查删除权限。
这个视图允许我安全地删除图书。 我限制了权限,只有员工用户或创建图书的用户才能删除图书。 安全性和功能性,一举两得!
10.ArchiveIndexView:按日期查找档案的向导
ArchiveIndexView 用于显示按日期排序的最新对象列表。这在创建博客档案页面时非常有用。
从 django.views.generic.dates 导入 ArchiveIndexView
从 .models import BlogPost
类 BlogArchiveIndexView(ArchiveIndexView):
模型 = BlogPost
date_field = "发布日期"
template_name = "blog_archive.html" 模板名称
context_object_name = "latest_posts"
allow_future = False
paginate_by = 10代码评注:
- Import ArchiveIndexView from django.views.generic.dates.
- 导入 BlogPost 模型
- 定义 BlogArchiveIndexView 类并从 ArchiveIndexView 继承。
- 设置模型、date_field、template_name 和 context_object_name 属性。
- 将 allow_future 设为 False,以禁止未来日期的帖子。
- 使用 paginate_by 设置每页显示的帖子数。
该视图允许你按日期对博文进行排序,并按照从最新到最旧的顺序显示博文。 它甚至还能帮你分页,非常方便,不是吗?
11. YearArchiveView:年度档案总览
YearArchiveView 用于显示特定年份的对象列表。这对于按年份显示年度报告或博客文章非常有用。
从 django.views.generic.dates 导入 YearArchiveView
从 .models import BlogPost
类 BlogYearArchiveView(YearArchiveView):
模型 = BlogPost
date_field = "发布日期"
make_object_list = True
template_name = "blog_year_archive.html"
year_format = "%Y代码评注:
- Import YearArchiveView from django.views.generic.dates.
- 导入 BlogPost 模型
- 定义 BlogYearArchiveView 类并继承自 YearArchiveView。
- 设置模型、日期字段和模板名称属性。
- 将 make_object_list 设为 "True",以生成该年所有对象的列表。
- 用 year_format 指定年份格式。
该视图可轻松显示特定年份的博客文章--它从 URL 中提取年份,只显示该年份的文章,非常适合实现存档功能!
12. MonthArchiveView:月度档案向导
MonthArchiveView 用于显示特定月份的对象列表。它非常适合显示月度报告或月度博文。
从 django.views.generic.dates 导入 MonthArchiveView
从 .models 导入 BlogPost
类 BlogMonthArchiveView(MonthArchiveView):
模型 = BlogPost
date_field = "published_date" (发布日期)
template_name = "blog_month_archive.html"
month_format = "%m
allow_future = False代码评注:
- Import MonthArchiveView from django.views.generic.dates.
- 导入 BlogPost 模型
- 定义 BlogMonthArchiveView 类并继承自 MonthArchiveView。
- 设置模型、日期字段和模板名称属性。
- 用 month_format 指定月份格式。
- 将 allow_future 设为 False,以抑制未来月份的帖子。
该视图可轻松显示特定月份的博文--它从 URL 中获取年份和月份,只显示该月份的博文,非常适合实施每月存档功能!
好了,这就是 12 个通用视图,让我们继续看剩下的 4 个。
13. WeekArchiveView:周档案大师
WeekArchiveView 用于显示特定星期的对象列表。这对于显示每周报告或每周博文非常有用。
从 django.views.generic.dates 导入 WeekArchiveView
从 .models 导入 BlogPost
类 BlogWeekArchiveView(WeekArchiveView):
模型 = BlogPost
date_field = "published_date" (发布日期)
template_name = "blog_week_archive.html" 模板名称
week_format = "%W"
allow_future = False代码评注:
- Import WeekArchiveView from django.views.generic.dates.WeekArchiveView。
- 导入 BlogPost 模型
- 定义 BlogWeekArchiveView 类并继承自 WeekArchiveView。
- 设置模型、日期字段和模板名称属性。
- 用 week_format 指定星期格式(%W 表示今年的星期)。
- 将 allow_future 设置为 "假",以抑制未来的关注帖子。
该视图可轻松显示特定一周的博文,非常适合实施每周回顾或每周总结功能!
14.DayArchiveView:每日档案向导
DayArchiveView 用于显示特定日期的对象列表。它非常适合显示特定日期的每日报告或博文。
从 django.views.generic.dates 导入 DayArchiveView
从 .models 导入 BlogPost
类 BlogDayArchiveView(DayArchiveView):
模型 = BlogPost
date_field = "published_date" (发布日期)
template_name = "blog_day_archive.html"
month_format = "%m
allow_future = False
context_object_name = "posts代码评注:
- 从 django.views.generic.dates.DayArchiveView 导入 DayArchiveView。
- 导入 BlogPost 模型
- 定义 BlogDayArchiveView 类并继承自 DayArchiveView。
- 设置模型、日期字段和模板名称属性。
- 用 month_format 指定月份格式。
- 将 allow_future 设为 False,以禁止未来日期的帖子。
- 用 context_object_name 指定模板中要使用的对象列表名称。
该视图可轻松显示特定日期的博文--非常适合每日日记或显示特定日期的活动!
15. TodayArchiveView: 今日档案杰作
TodayArchiveView 用于显示从今天开始的对象列表。这非常适合显示今天的新闻或今天发布的博文。
从 django.views.generic.dates 导入 TodayArchiveView
从 .models 导入 BlogPost
类 BlogTodayArchiveView(TodayArchiveView):
模型 = BlogPost
date_field = "published_date" (日期字段)
template_name = "blog_today_archive.html" 模板名称
context_object_name = "todays_posts代码评注:
- 从 django.views.generic.dates.TodayArchiveView 导入 TodayArchiveView。
- 导入 BlogPost 模型
- 定义 BlogTodayArchiveView 类并继承于 TodayArchiveView。
- 设置模型、日期字段和模板名称属性。
- 用 context_object_name 指定模板中要使用的对象列表名称。
该视图可轻松显示今天发布的博文,非常适合实施 "今日特写 "等功能!
16.DateDetailView:日期特定详细信息向导
DateDetailView 用于显示特定对象在特定日期的详细信息。 它对于显示每个日期都有唯一 URL 的博客文章非常有用。
从 django.views.generic.dates 导入 DateDetailView
从 .models 导入 BlogPost
类 BlogDateDetailView(DateDetailView):
模型 = BlogPost
date_field = "published_date" 日期字段
month_format = "%m
template_name = "blog_detail.html" 模板名称
context_object_name = "post
allow_future = False代码评注:
- 从 django.views.generic.dates.DateDetailView 导入 DateDetailView。
- 导入 BlogPost 模型
- 定义 BlogDateDetailView 类并继承自 DateDetailView。
- 设置模型、日期字段和模板名称属性。
- 用 month_format 指定月份格式。
- 用 context_object_name 指定模板中要使用的对象名称。
- 将 allow_future 设为 False,以禁止未来日期的帖子。
您可以使用该视图显示特定日期发布的特定博文的详细信息。 在 URL 中包含日期非常有利于搜索引擎优化,也是向用户清晰传达信息的好方法!
总结
这就是 Django 的全部 16 个通用视图,如果使用得当,它们可以大大缩短网络开发时间并提高代码的可重用性。
不过,使用泛型视图也有一些注意事项:有时,如果需要进行过多的自定义,使用基于函数的泛型视图可能会更简单。 另外,如果不了解泛型视图的确切工作原理,可能会得到意想不到的结果。
不过,在大多数情况下,通用视图使 Django 开发更有效率,尤其是在执行 CRUD(创建、读取、更新、删除)操作时。
现在,您已经了解了 Django 的全部 16 个通用视图,可以利用这些知识构建更高效、更强大的 Django 应用程序。
# 术语表
- 通用视图:Django 提供常用视图模式抽象的能力。
- CRUD:"创建"、"读取"、"更新 "和 "删除 "的缩写,是数据处理的四种基本功能。
- 上下文:传递给模板的变量集
- 查询集:从数据库传入的对象列表。
- 分页:将大量对象分成多个页面显示的功能。
- URL 引用:使用 URL 模式名称生成相应 URL 的功能
- 中间件:介于请求和响应处理之间的系统。
- 对象关系映射(ORM):一种将对象与关系数据库连接起来的技术。
- 模板:Django 允许您在 HTML 文件中使用 Python 变量和标记的功能。
- 基于类的视图(CBV):基于类的视图。







