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