基于类的视图和基于函数的视图的区别

Django 是最流行的网络开发框架之一。它受欢迎的原因是它提供了许多内置功能,节省了开发人员的大量时间。如果你是初学者,那么理解项目的流程需要一些时间。但是一旦你获得了一些经验,你就可以很容易地理解特性的执行。

Django 基于 MVT 模式,意思是模型视图模板。我们主要使用两种类型的视图——基于函数的视图和基于类的视图。如果你是初学者,你必须意识到基于函数的视图(FBV)。

当 Django 被引入时,它只支持基于函数的视图,但是后来 Django 增加了基于类的视图的概念。基于类的视图减少了代码的冗余。它还支持 Django 的 DRY 概念。

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

Django 观点的要求

以下是我们应该记住的关于 Django 观点的几点。

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

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

基于函数的视图

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

Django 项目通常有 CRUD 操作,所以我们需要不必要地多次实现相同的代码,这就是基于 Django 类的视图出现在场景中的原因。创建基于类的视图是为了解决代码冗余问题。让我们了解一下 FBV 的利弊。

基于函数的视图的优势

FBV 的优势如下。

  • 易于实施、阅读和理解
  • 显式代码流
  • 装饰器很容易实现
  • 适合一次性或专用功能
  • 有助于理解 Django 的核心概念。

基于函数的视图的缺点

FBV 的缺点如下。

  • 代码冗余是 FBV 最关心的问题。
  • 条件分支将用于处理 HTTP 请求。
  • 很难扩展代码。

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

代码


def  create_view(request, pk):
    template_name = 'form.html'
    form_class = MyForm

    form = form_class

    if request.method == 'POST':
    form = form_class(request.POST)
    if form.is_valid():
      form.save()
      return HttpResponseRedirect(reverse('list-view'))

    return render(request, template_name, {'form': form})

基于类的视图

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

对于初学者来说,获得基于类的视图的概念有点困难。你应该看一下文件,然后好好学习。如果你对基于函数的视图有一个清晰的概念,你可以转到基于类的视图。

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

基于类的视图的优势

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

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

基于类的视图的缺点

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

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

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


class MyCreateView(View):
    template_name = 'form.html'
    form_class = MyForm

    def get(self, request, *args, **kwargs):
        form = self.form_class
            return render(request, template_name, {'form': form})

     def post(self, request, *args, **kwargs):
            form = self.form_class(request.POST)
         if form.is_valid():
                form.save()
            return HttpResonseRedirect(reverse('list-view'))
            else:
        return render(request, self.template_name, {'form': form})

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


urlpatterns = [
    url(new/', MyCreateView.as_view(), name='original-create-view'),
    url(new_two/', MyCreateView.as_view(), name='modified-create-view')
    ]

当我们使用基于 Django 泛型类的视图时,我们可以重写像 get_formclass 和 get template _ names 这样的帮助器方法。我们还可以在这些地方添加一些自定义逻辑,而不仅仅是覆盖类属性。

ModelFormMixin 就是最好的例子之一。用存储在 self.object form_valid 方法中的更新值覆盖 form_valid 方法。

Django 通用基于类的视图

在基于泛型类的视图的帮助下,我们可以执行一些重要的任务,如创建新对象、列表视图、分页、表单处理、归档视图、删除视图等。

我们可以通过导入django . views . Generic .Generic 基于类的视图来实现这一点,这是执行一些基本任务的好方法。它加快了开发过程。

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

它节省了我们反复编写相同代码的时间。在下面的例子中,我们可以修改我的创建视图来继承django . views . generic . createview。


from django.views.generic import CreateView
class FirstCreateView(CreateView):
    model = MyModel
    form_class = MyForm

我们可以观察到,与以前的视图相比,它需要非常少的代码。django . views . generic . create view 带有许多内置功能和快捷方式。让我们再讨论一些细节。

默认模板应该驻留在/ / form.html 中,我们可以通过设置类属性**模板 名称和模板 _ 名称 _sufix** 进行修改。

  • 在 CreateView 类中,我们需要指定模型名称和 form_class_attributes。
  • 我们还需要指定 successurl,它将在成功提交表单后重定向到上述页面。可以使用**get absolute _ URL()完成。**
  • 我们可以在视图上指定字段的类属性。下面是表单域的示例。

from django import forms
from . models import MyModel
class MyModelForm(forms.ModelForm):
class Meta:
    model = MyModel
    fields = ['name', 'description']

结论

这是开发人员之间的一个热门争论,即哪些视图最好使用基于类或基于函数的视图?我们已经讨论了这两种视图的用途、缺点和优点。这完全取决于项目要求和你对什么感到满意。在某些情况下,基于类的视图表现良好,在某些情况下,基于函数的视图表现更好。


原创文章,作者:DFZ8J,如若转载,请注明出处:https://www.506064.com/n/130626.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
DFZ8JDFZ8J
上一篇 2024-10-03 23:29
下一篇 2024-10-03 23:29

相关推荐

  • Python中引入上一级目录中函数

    Python中经常需要调用其他文件夹中的模块或函数,其中一个常见的操作是引入上一级目录中的函数。在此,我们将从多个角度详细解释如何在Python中引入上一级目录的函数。 一、加入环…

    编程 2025-04-29
  • Python中new和init的区别

    new和init都是Python中常用的魔法方法,它们分别负责对象的创建和初始化,本文将从多个角度详细阐述它们的区别。 一、创建对象 new方法是用来创建一个对象的,它是一个类级别…

    编程 2025-04-29
  • Python中capitalize函数的使用

    在Python的字符串操作中,capitalize函数常常被用到,这个函数可以使字符串中的第一个单词首字母大写,其余字母小写。在本文中,我们将从以下几个方面对capitalize函…

    编程 2025-04-29
  • Python中set函数的作用

    Python中set函数是一个有用的数据类型,可以被用于许多编程场景中。在这篇文章中,我们将学习Python中set函数的多个方面,从而深入了解这个函数在Python中的用途。 一…

    编程 2025-04-29
  • 三角函数用英语怎么说

    三角函数,即三角比函数,是指在一个锐角三角形中某一角的对边、邻边之比。在数学中,三角函数包括正弦、余弦、正切等,它们在数学、物理、工程和计算机等领域都得到了广泛的应用。 一、正弦函…

    编程 2025-04-29
  • 单片机打印函数

    单片机打印是指通过串口或并口将一些数据打印到终端设备上。在单片机应用中,打印非常重要。正确的打印数据可以让我们知道单片机运行的状态,方便我们进行调试;错误的打印数据可以帮助我们快速…

    编程 2025-04-29
  • Python3定义函数参数类型

    Python是一门动态类型语言,不需要在定义变量时显示的指定变量类型,但是Python3中提供了函数参数类型的声明功能,在函数定义时明确定义参数类型。在函数的形参后面加上冒号(:)…

    编程 2025-04-29
  • Python实现计算阶乘的函数

    本文将介绍如何使用Python定义函数fact(n),计算n的阶乘。 一、什么是阶乘 阶乘指从1乘到指定数之间所有整数的乘积。如:5! = 5 * 4 * 3 * 2 * 1 = …

    编程 2025-04-29
  • Python定义函数判断奇偶数

    本文将从多个方面详细阐述Python定义函数判断奇偶数的方法,并提供完整的代码示例。 一、初步了解Python函数 在介绍Python如何定义函数判断奇偶数之前,我们先来了解一下P…

    编程 2025-04-29
  • Sublime Test与Python的区别

    Sublime Text是一款流行的文本编辑器,而Python是一种广泛使用的编程语言。虽然Sublime Text可以用于编写Python代码,但它们之间有很多不同之处。接下来从…

    编程 2025-04-29

发表回复

登录后才能评论