Django 基于类的通用视图

2025年03月17日 | 阅读 9 分钟

Django 是 Python 最流行的 Web 框架,用于快速 Web 应用程序开发。它提供了一个内置的界面,使您可以轻松地使用它。它也被称为“电池”包含框架,因为它为每个操作都提供了内置的设施。

我们大多数人可能已经熟悉基于函数的视图,并且知道如何使用基于函数的视图来处理请求。如果您不熟悉它们,请访问我们的 Django 教程。

在本教程中,我们将介绍基于类的通用视图。这些是高级的内置视图集,用于实现选择性 CRUD(创建、检索、更新和删除)操作。使用基于类的视图,我们可以轻松处理视图的 GET、POST 请求。

它们不能替代基于函数的视图,但提供了基于函数的视图的一些额外设施。

让我们简要概述一下基于函数的视图和基于类的视图。

基于函数的视图

基于函数的视图对初学者友好;初学者可以轻松理解它们。与基于类的视图相比,它很容易理解。

  • 它易于理解和使用。
  • 它提供了显式的代码流程。
  • 装饰器的直接用法。

但是基于函数的视图无法扩展,并且还会导致代码冗余。

基于类的视图

基于类的视图可以代替基于函数的视图使用。所有操作都使用 Python 对象而不是函数来处理。它们提供了优于基于函数的视图的一些优秀示例。基于类的视图可以以简单的方式实现 CRUD 操作。

  • 它遵循 Django 的 DRY 约定。
  • 我们可以扩展基于类的视图,并且可以使用 Mixin 根据需求添加更多功能。
  • 它允许继承另一个类,可以针对各种用例进行修改。

但是,这些比较复杂,难以理解和阅读。它具有隐式的代码流程。

使用基于类的视图执行 CRUD(创建、检索、更新、删除)

我们将演示如何使用基于类的视图创建基本的 CRUD 应用程序。

我们将创建项目名称 Hello,其中包括一个名为 sampleapp 的应用程序。如果您不知道如何在 django 中创建应用程序,请访问 Django App 教程。

在应用程序中,我们将在 model.py 文件中创建一个 Employee 模型。

示例 -

然后我们运行以下命令。

python manage.py makemigrations
python manage.py migrate

现在,我们将在 form.py 文件中为此模型创建 Django ModelForm。它将用于将表单显示到模板。

forms.py

实现基于类的视图

基于函数的视图使用不同的类实例方法返回不同的 HTTP 请求方法。因此,基于函数的方法将如下所示。

如果我们实现基于类的视图,它将如下所示。

要处理基于类的视图,我们需要在 urls.py 文件中使用 as_view()

CreateView(创建视图)

CreateView 实现视图以在数据库中创建表的实例。此视图会自动完成创建实例的所有操作。我们只需要指定要创建视图及其字段的模型名称。基于类的创建视图将搜索 employee_form.html。让我们看看创建视图的以下示例。

注意 - employee_form.html 文件应包含在 template/app_name/employee_form.html 中。在我们的例子中,文件位置是 template/sampleapp/employee_form.html。

View.py

urls.py

现在我们在本地主机上运行服务器。

输出

Django Class Based Generic Views

在这里,我们得到了一个表单,可以在其中创建一个员工。让我们看看创建员工的演示。

Django Class Based Generic Views

正如我们可以在管理面板中看到的那样,员工已在数据库中创建。

Django Class Based Generic Views

Retrieve View(检索视图)

有两种检索视图 - ListViewDetailView。 我们将使用 ListView,它指的是用于在数据库中显示表多个实例的视图。我们只需要指定应用 ListView 的模型名称,基于类的 ListView 将自动为我们完成这项工作。要检索数据,我们需要创建 app_name/modelname_list.html 文件。

views.py

url.py

sampleapp/template/employee_list.html

现在,我们运行 localhost 服务器并将请求发送以获取数据。

Django Class Based Generic Views

DetailView(详细视图)

DetailView 与 ListView 不同,因为它显示了数据库中表的一个实例。 Django 自动为每个条目分配一个主键,并且我们需要在请求中指定 <pk>。 DetailView 将自动执行所有操作。 DetailView 的实现与 ListView 相同,我们需要创建 modelname_detail.html.

让我们了解 DetailView 的以下实现。

View.py

url.py

sampleapp/template/employee_detail.html

我们创建了一个新员工,并将其分配为 2 作为主键。 运行服务器并提供带有主键的请求。

输出

Django Class Based Generic Views

UpdateView(更新视图)

UpdateView 允许从数据库更新表中特定实例的更多详细信息。此视图用于更改数据库中的条目。例如,我们想更改用户的姓氏。我们需要指定模型名称,它将自动完成所有操作。让我们看看 UpdateView 的以下实现。

我们已经在模板中创建了 employee_form.html 文件。 在我们的例子中,它是 D:\python_project\Myfirstdjangoproject\hello\template\employee_form.html>

View.py

url.py

输出

Django Class Based Generic Views

我们已经更新了对象的姓氏。 更新后的值将自动添加到数据库中。

Django Class Based Generic Views

DeleteView(删除视图)

DeleteView 允许从数据库中删除表的实例。 它用于删除数据库中的条目。

我们只需要指定模型名称,它就会自动完成所有操作。 让我们看看 UpdateView 的以下实现。

view.py

现在,我们创建 URL 路径来映射视图。

url.py

现在,我们创建 template/sampleapp/employee_confirm_delete.html.

输出

Django Class Based Generic Views

当我们单击确认按钮时,该对象将被删除并重定向到主页。

我们已经使用类创建了 CRUD 操作

代码

以下是基于类的通用视图的完整代码。

View.py

Hello/urls.py

sampleapp/url.py

template/base.html

template/sampleapp/employe_list

template/sampleapp/employe_detail

template/sampleapp/employe_update_form.html

template/sampleapp/employe_confirm_delete.html

结论

在本教程中,我们讨论了基于类的视图以及它们与基于函数的视图有何不同。我们使用内置视图实现了 CRUD 操作。

CBV 是一种从现有视图继承并覆盖属性 (template_name) 或方法的功能强大的方法。

这些视图具有预先编写的代码,因此我们不需要进行硬编码。但是,不建议初学者使用它,因为它无助于理解 Django 的核心深度。一旦您熟悉了基于函数的视图的概念。您可以转移到基于类的视图。