类视图与函数视图的区别

17 Mar 2025 | 5 分钟阅读

Django 是最受欢迎的 Web 开发框架之一。它之所以受欢迎,是因为它提供了许多内置功能,可以节省开发者大量时间。如果您是初学者,理解项目的流程需要一些时间。但一旦您获得一些经验,就可以轻松理解功能的执行。

Django 基于 MVT 模式,即 Model View Template。我们主要使用两种视图:基于函数的视图和基于类的视图。如果您是初学者,必须了解基于函数的视图 (FBV)。

Django 引入时,它仅支持基于函数的视图,但后来 Django 添加了基于类的视图的概念。基于类的视图减少了代码的冗余。它还支持 Django 的 DRY 原则。

在本教程中,我们将深入学习 FBV 和 CBC 之间有什么不同。我们可以使用基于函数的视图和基于类的视图执行相同的任务。但这两种方法是不同的。

Django 视图的要求

以下是关于 Django 视图应记住的几点。

  • 视图的第一个位置参数应为
  • 它应返回 HttpResponse 对象,或引发异常。
  • Django 视图是可调用的。我们可以使用这两种方法:基于函数的或基于类的。在使用 CBV 时,我们继承了 as_view() 方法,该方法使用 dispatch() 方法根据 HTTP 请求调用适当的方法。

让我们详细解释创建视图的方式。

基于函数的视图

基于函数的视图简单易用,初学者很容易理解。它有助于理解 Django 基础的核心概念。FBV 提供了从头开始理解 Django 概念的优势。

Django 项目通常具有 CRUD 操作,因此我们需要不必要地为多个操作实现相同的代码,这就是 Django 类视图出现的原因。类视图的创建是为了解决代码冗余问题。让我们理解 FBV 的以下优缺点。

基于函数的视图的优点

FBV 的优点如下。

  • 易于实现、阅读和理解
  • 明确的代码流程
  • 易于实现装饰器
  • 适用于一次性或特定功能
  • 有助于理解 Django 的核心概念。

基于函数的视图的缺点

FBV 的缺点如下。

  • 代码冗余是 FBV 最主要的问题。
  • 将使用条件分支来处理 HTTP 请求。
  • 难以扩展代码。

让我们来理解 FBV 的以下实现。

代码

基于类的视图

基于类的视图是在 Python 中创建视图的高级方法。它作为 Python 对象而不是函数在项目中实现。它不是 FBV 的替代品,但它们提供了优于基于函数的视图的优势。它减少了代码重复,并处理了删除和添加项目等基本操作。

初学者理解类视图的概念会有些困难。您应该查看文档,并需要仔细研究。如果您清楚地了解了基于函数的视图,就可以转向基于类的视图。

让我们来理解 Python 中视图的以下优缺点。

基于类的视图的优点

以下是基于类的视图的优点。

  • CBV 的最大优点之一是继承。CBV 允许我们继承另一个类,并可以针对不同的用例进行修改。
  • 它支持 DRY 原则。它避免了代码的重复。在基于类的视图中可以实现代码的重用。
  • 它附带内置的通用类视图。
  • 基于类的视图提供了 proper 的代码结构。我们可以使用不同的类实例方法(而不是基于函数的视图中的条件分支语句)来生成 HTTP 请求。

基于类的视图的缺点

以下是基于类的视图的缺点。

  • 难以理解,实现复杂。
  • 隐式的代码流程。
  • 在视图装饰器中需要额外的导入或方法覆盖。

让我们看看类视图的实现。

我们调用 as_view() 方法为用户提供服务。as_view() 方法会调用 dispatch() 方法来确定需要执行哪个类方法,具体取决于 HTTP 请求。我们可以按以下方式实现它。

当我们使用 Django 的通用类视图时,我们可以覆盖诸如 get_form_class 和 get_template_names 之类的辅助方法。我们也可以在这些点添加一些自定义逻辑,而不仅仅是覆盖类属性。

ModelFormMixin 是一个很好的例子。form_valid 方法被覆盖,并将更新后的值存储在 self.object 中。form_valid 方法被覆盖。

Django 通用类视图

借助通用类视图,我们可以执行一些重要任务,例如创建新对象、列表视图、分页、表单处理、归档视图、删除视图等。

我们可以通过导入 django.views.generic. 来实现。通用类视图是执行一些基本任务的出色方式。它加快了开发过程。

Django 提供了一组 mixins 和通用类视图。借助这些工具,我们可以解决 Web 开发中最常见的任务。

它使我们不必一次又一次地编写相同的代码。在下面的示例中,我们可以修改 MyCreateView 以继承自 django.views.generic.CreateView

正如我们所观察到的,与之前的视图相比,它所需的代码非常少。django.views.generic.CreateView 附带了许多内置功能和快捷方式。让我们讨论更多细节。

默认情况下,模板应位于 /<modelname>/<modelname>_form.html。我们可以通过设置类属性 template_nametemplate_name_sufix 来修改它。

  • 在 CreateView 类中,我们需要指定 model 名称和 form_class_attributes。
  • 我们还需要指定 success_url,它将在表单成功提交后重定向到该页面。这可以通过 get_absoute_url(). 来完成。
  • 我们可以在视图上指定 fields 的类属性。以下是表单字段的示例。

结论

关于哪个视图最好使用——类视图还是函数视图——这是一个开发者之间热烈的争论。我们已经讨论了这两种视图的用途、缺点和优点。这完全取决于项目的需求以及您的舒适度。在某些情况下,类视图表现更好,在某些情况下,函数视图更好。