通往 Django 大师之路:最大限度提高网站开发效率的 16 种通用视图

你好,充满激情 Django 嘿,开发人员!今天我们有一个非常激动人心的话题。我们将深入探讨 "16 种通用视图"。

众所周知,使用 Django 进行网络开发有时会因为代码重复而令人沮丧,但不用担心,一旦掌握了 Django 的通用视图,这些问题就会迎刃而解。

在这篇文章中,我们将深入介绍 Django 的 16 个通用视图,并通过实际代码示例了解如何使用它们。 我们将保持足够简单,让初学者和中级用户都能理解,所以请跟紧我们!

제네릭 뷰 16가지
(16 个 Django 通用视图)

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.')

代码评注:

  1. 从 django.views.View 中导入 View 类。
  2. 导入 HttpResponse,以便返回 HTTP 响应。
  3. 定义 MyView 类并从 View 类继承。
  4. 定义一个 get 方法来处理 GET 请求。
  5. 定义 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"。
        返回上下文

代码评注:

  1. Import TemplateView from django.views.generic.
  2. 定义一个 HomePageView 类并继承自 TemplateView。
  3. 设置 template_name 属性以指定要使用的模板。
  4. 重载 get_context_data 方法以传递额外的上下文数据。
  5. 调用 super() 获取默认上下文数据。
  6. 使用 "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

代码评注:

  1. 从 django.views.generic.RedirectView 导入 RedirectView。
  2. 定义 OldUrlRedirectView 类并继承自 RedirectView。
  3. 设置 url 属性,指定要重定向到的目标 URL。
  4. 将 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')

代码评注:

  1. 从 django.views.generic.ListView 导入一个 ListView。
  2. 导入要使用的模型(图书)。
  3. 定义类 BookListView 并继承自 ListView。
  4. 设置模型属性以指定要使用的模型。
  5. 以 template_name 指定要使用的模板。
  6. 用 context_object_name 指定模板中要使用的对象列表名称。
  7. 使用 paginate_by 设置每页显示的对象数量。
  8. 重载 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

代码评注:

  1. 从 django.views.generic.View 导入一个 DetailView。
  2. 导入要使用的模型(图书)。
  3. 定义一个 BookDetailView 类并继承自 DetailView。
  4. 设置模型、模板名称和上下文对象名称属性。
  5. 重载 get_context_data 方法,以提供额外的上下文数据。
  6. 添加同一作者的其他相关书籍(最多 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)

代码评注:

  1. 从 django.views.generic.FormView 导入 FormView。
  2. 导入 reverse_lazy 函数,以轻松评估 URL 解除引用。
  3. 导入要使用的表单类 (ContactForm)。
  4. 定义 ContactFormView 类并继承自 FormView。
  5. 设置 template_name、form_class 和 success_url 属性。
  6. 重载 form_valid 方法,以定义表单有效时的行为。
  7. 调用表单的 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)

代码评注:

  1. 从 django.views.generic.CreateView 导入 CreateView。
  2. 导入 reverse_lazy 函数和图书模型。
  3. 定义 BookCreateView 类并从 CreateView 继承。
  4. 设置模型、字段、模板名称和 success_url 属性。
  5. 重载 form_valid 方法,以定义表单有效时的行为。
  6. 将当前登录的用户设置为图书的创建者。

该视图允许将新书添加到数据库中。提交表单后,它会自动将当前登录的用户设置为图书的创建者,并将其重定向到图书列表页面。

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)

代码评注:

  1. Import UpdateView from django.views.generic.
  2. 导入 reverse_lazy 函数和图书模型。
  3. 定义 BookUpdateView 类并继承自 UpdateView。
  4. 设置模型、字段和模板名称属性。
  5. 重载 get_success_url 方法,动态生成成功 URL。
  6. 在 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

代码评注:

  1. Import DeleteView from django.views.generic.
  2. 导入 UserPassesTestMixin 以执行权限检查。
  3. 定义一个 BookDeleteView 类,并从 UserPassesTestMixin、DeleteView 继承。
  4. 设置模型、模板名称和 success_url 属性。
  5. 重载 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

代码评注:

  1. Import ArchiveIndexView from django.views.generic.dates.
  2. 导入 BlogPost 模型
  3. 定义 BlogArchiveIndexView 类并从 ArchiveIndexView 继承。
  4. 设置模型、date_field、template_name 和 context_object_name 属性。
  5. 将 allow_future 设为 False,以禁止未来日期的帖子。
  6. 使用 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

代码评注:

  1. Import YearArchiveView from django.views.generic.dates.
  2. 导入 BlogPost 模型
  3. 定义 BlogYearArchiveView 类并继承自 YearArchiveView。
  4. 设置模型、日期字段和模板名称属性。
  5. 将 make_object_list 设为 "True",以生成该年所有对象的列表。
  6. 用 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

代码评注:

  1. Import MonthArchiveView from django.views.generic.dates.
  2. 导入 BlogPost 模型
  3. 定义 BlogMonthArchiveView 类并继承自 MonthArchiveView。
  4. 设置模型、日期字段和模板名称属性。
  5. 用 month_format 指定月份格式。
  6. 将 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

代码评注:

  1. Import WeekArchiveView from django.views.generic.dates.WeekArchiveView。
  2. 导入 BlogPost 模型
  3. 定义 BlogWeekArchiveView 类并继承自 WeekArchiveView。
  4. 设置模型、日期字段和模板名称属性。
  5. 用 week_format 指定星期格式(%W 表示今年的星期)。
  6. 将 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

代码评注:

  1. 从 django.views.generic.dates.DayArchiveView 导入 DayArchiveView。
  2. 导入 BlogPost 模型
  3. 定义 BlogDayArchiveView 类并继承自 DayArchiveView。
  4. 设置模型、日期字段和模板名称属性。
  5. 用 month_format 指定月份格式。
  6. 将 allow_future 设为 False,以禁止未来日期的帖子。
  7. 用 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

代码评注:

  1. 从 django.views.generic.dates.TodayArchiveView 导入 TodayArchiveView。
  2. 导入 BlogPost 模型
  3. 定义 BlogTodayArchiveView 类并继承于 TodayArchiveView。
  4. 设置模型、日期字段和模板名称属性。
  5. 用 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

代码评注:

  1. 从 django.views.generic.dates.DateDetailView 导入 DateDetailView。
  2. 导入 BlogPost 模型
  3. 定义 BlogDateDetailView 类并继承自 DateDetailView。
  4. 设置模型、日期字段和模板名称属性。
  5. 用 month_format 指定月份格式。
  6. 用 context_object_name 指定模板中要使用的对象名称。
  7. 将 allow_future 设为 False,以禁止未来日期的帖子。

您可以使用该视图显示特定日期发布的特定博文的详细信息。 在 URL 中包含日期非常有利于搜索引擎优化,也是向用户清晰传达信息的好方法!

总结

这就是 Django 的全部 16 个通用视图,如果使用得当,它们可以大大缩短网络开发时间并提高代码的可重用性。

不过,使用泛型视图也有一些注意事项:有时,如果需要进行过多的自定义,使用基于函数的泛型视图可能会更简单。 另外,如果不了解泛型视图的确切工作原理,可能会得到意想不到的结果。

不过,在大多数情况下,通用视图使 Django 开发更有效率,尤其是在执行 CRUD(创建、读取、更新、删除)操作时。

现在,您已经了解了 Django 的全部 16 个通用视图,可以利用这些知识构建更高效、更强大的 Django 应用程序。

# 术语表

  1. 通用视图:Django 提供常用视图模式抽象的能力。
  2. CRUD:"创建"、"读取"、"更新 "和 "删除 "的缩写,是数据处理的四种基本功能。
  3. 上下文:传递给模板的变量集
  4. 查询集:从数据库传入的对象列表。
  5. 分页:将大量对象分成多个页面显示的功能。
  6. URL 引用:使用 URL 模式名称生成相应 URL 的功能
  7. 中间件:介于请求和响应处理之间的系统。
  8. 对象关系映射(ORM):一种将对象与关系数据库连接起来的技术。
  9. 模板:Django 允许您在 HTML 文件中使用 Python 变量和标记的功能。
  10. 基于类的视图(CBV):基于类的视图。
테리 이모티콘
(快乐编码)

类似文章