基于类的视图创建 Django 视图
什么是 Django?
Django 是一个用 Python 编写的知名 Web 框架,它使开发人员能够更快地创建 Web 应用程序。Django 应用程序中的视图负责处理 HTTP 请求并发送回 HTTP 响应。基于类的视图 (CBV) 是基于函数的视图 (FBV) 的替代方案。它们提供了一种更面向对象的方法来设计视图。
在 Django 框架中,CBV 指的是继承自 Django 内置视图类之一的 Python 类。这些类提供与各种 HTTP 方法(GET、POST、PUT、DELETE 等)相关的方法,并允许您描述您的视图对于每种 HTTP 方法的行为方式。例如,get 对应 GET 方法,post 对应 POST 方法,依此类推。
CBV 的主要优点之一是它们提供了一种更结构化的组织代码的方式,因为您可以在父类中定义可重用的行为,并在您的视图中继承这些类。这使得您可以创建更复杂的视图逻辑,因为您可以修改内置视图方法的默认行为。
总的来说,CBV 提供了一种更面向对象的方法来构建 Django 中的视图。这允许您以更结构化的方式组织代码,并为您的视图指定更复杂的逻辑。它们是使用 Django 框架构建可靠 Web 应用程序的有效工具。
先决条件
本教程假设您已经对 Django 和 Python 都有基本的了解。您应该已经在计算机上安装了 Django,并且已经组织好一个项目并准备开始。
步骤和流程
步骤 1:使用基于函数的视图创建视图
在我们深入研究 CBV 之前,让我们首先使用基于函数的视图 (FBV) 创建一个视图。视图是处理 HTTP 请求并返回 HTTP 响应的函数。FBV 是在 Django 中创建视图的一种简单方法。
from django.shortcuts import render def index(request): context = {} return render(request, 'index.html', context)
在上面的代码中,我们创建了一个名为 index 的视图。此视图获取一个请求对象,并通过呈现名为 index.html 的 HTML 模板返回 HTTP 响应。
步骤 2:使用基于类的视图创建视图
我们刚刚创建的 index 视图作为 CBV 的等效项如下所示:
语法
from django.views import View from django.shortcuts import render class IndexView(View): def get(self, request): context = {} return render(request, 'index.html', context)
如您所见,我们创建了一个名为 IndexView 的类,它继承自 django.views.View 类。为了处理 HTTP 请求,我们定义了一个名为 get 的方法,该方法将请求对象作为参数。然后,我们定义我们将用于呈现模板的上下文字典并返回呈现的响应。
步骤 3:使用 Django 的 TemplateView
Django 附带许多内置 CBV,可以简化常见任务。其中一个视图是 TemplateView。TemplateView 负责为我们呈现模板。
要在您的项目中使用 TemplateView,您需要从 django.views.generic 导入它。这是一个使用 TemplateView 的示例:
语法
from django.views.generic import TemplateView class IndexView(TemplateView): template_name = 'index.html'
在上面的代码中,我们使用了 TemplateView 来创建我们的视图。我们定义了 template_name 属性来告诉 Django 使用哪个模板来呈现响应。您还可以通过覆盖 get_context_data 方法来定义其他上下文数据。
步骤 4:使用 Django 的 FormView 处理表单
Django 还提供了一个 FormView CBV,可以简化表单处理。FormView 处理显示表单、验证用户提交的数据以及处理这些数据的逻辑。
这是一个使用 FormView 的示例:
语法
from django.views.generic.edit import FormView from django.forms import ContactForm class ContactView(FormView): template_name = 'contact.html' form_class = ContactForm success_url = '/contact/' def form_valid(self, form): form.send_email() return super().form_valid(form)
start_timer 函数使用 time 模块的 strftime 函数更新当前时间标签为当前时间。它还将计时器标签设置为 25 分钟(番茄工作法的时间间隔长度),并在启用停止按钮的同时禁用启动按钮。stop_timer 函数将计时器标签重置为空字符串,并在启用启动按钮的同时禁用停止按钮。
在此示例中,我们定义了一个名为 ContactView 的视图,它继承自 FormView 类。我们定义了 template_name 属性来告诉 Django 使用哪个模板来显示表单。我们还定义了 form_class 属性来告诉 Django 使用哪个表单。
当表单成功验证时,将调用 form_valid 方法。在这里,我们正在表单对象上调用 send_email 方法,以电子邮件的形式发送表单数据。我们还定义了 success_url 属性来告诉 Django 表单成功提交后将用户重定向到哪里。
Django 中有哪些不同类型的基于类的视图?
Django 中可用的不同类型的基于类的视图包括:ListView、DetailView、CreateView、UpdateView、DeleteView、FormView 和 TemplateView。
在 Django 中使用基于类的视图有哪些优势?
在 Django 中使用基于类的视图有很多好处,包括:它允许代码重用;它简化了创建复杂视图的过程;并且它允许更高级别的视图行为定制。
在 Django 中创建基于类的视图的一些最佳实践是什么?
使用适合您正在创建的视图类型的视图类,使用 as_view() 方法创建视图类的实例,并使用 Django 提供的内置方法来自定义视图的行为。这些是在 Django 中创建基于类的视图的一些最佳实践。其他最佳实践包括:为要创建的视图类型使用合适的视图类。
为什么以及何时应该使用基于类的视图与函数视图?
如果您想在 Django 应用程序中构建完整的 CRUD 操作,基于类的视图是一个很好的选择。但是,如果您选择使用基于函数的视图,您也可以在花费稍多一点时间和精力的情况下做到同样的事情。
如何在 Django 中连接两个视图?
使用作为包装器视图一部分的视图,并将其作为视图函数或类中的上下文包含在内。在任何其他情况下,您可以像这样从上下文中构建视图,但它需要您提供一个请求对象:as_view(add context=context) 是 InlineView 类的函数 (request) 我也不确定您如何在事后将其包含到另一个视角中。
基于类的视图是什么意思?
也充当视图角色的类称为基于类的视图。因为它是一个类,所以可以创建类的不同实例,并使用不同的参数来修改视图的行为。这可以通过多种方式完成。这种类型的视图有几个名称:通用视图、可重用视图和可插入视图。
Django 视图函数的用途是什么?
视图函数(简称视图)是一个 Python 函数,它接收一个 Web 请求并返回一个 Web 响应。这个响应可以是网页的 HTML 内容、重定向、404 错误、XML 文档或图像。
基于类的视图的示例是什么?
这些是基于类的视图,并提供一些常见的附加功能。例如,一种常见的视图类型可以称为模板视图。这将指一个创建一些上下文然后将其传递给特定模板以显示的视图。TemplateView 是 Django 提供的特定于上述目的的通用基于类的视图。
基于类和面向对象有什么区别?
在处理面向对象编程时,可以区分两种类型的语言。基于类的语言围绕类的概念,类基本上只是事物的描述性类别。在面向对象的编程语言中,类的概念被构造所取代,以促进唯一对象的创建。
我们可以在 Django 中创建多个视图吗?
确实,这不仅适用于 views.py,而且也适用于 models.py 和 tests.py。
在 Django 中使用基于类的视图有什么缺点?
事实上,在 Django 中使用基于类的视图确实存在一些缺点。由于基于类的视图的代码分布在多个方法中,一个潜在的缺点是调试此类视图中的错误可能更困难。此外,与基于函数的视图相比,基于类的视图可能需要一开始就进行更多的设计和配置工作。
如何在 Django 视图中从表单获取值?
使用视图的表单
在 Django 中,作为参数传递给您的视图的请求对象有一个名为“method”的属性,用于确定请求的类型。此外,所有通过 POST 发送的数据都可以通过 request.POST 的字典查看。该视图将提供使用登录用户的帐户进行的登录表单提交的结果。
最终程序,代码
from django.shortcuts import render def index(request): context = {} return render(request, 'index.html', context) from django.views import View from django.shortcuts import render class IndexView(View): def get(self, request): context = {} return render(request, 'index.html', context) from django.views.generic import TemplateView class IndexView(TemplateView): template_name = 'index.html' from django.views.generic.edit import FormView from .forms import ContactForm class ContactView(FormView): template_name = 'contact.html' form_class = ContactForm success_url = '/contact/' def form_valid(self, form): form.send_email() return super().form_valid(form)
输出
结论
在本文中,我们已经介绍了在 Django 中生成 CBV 的步骤。我们研究了 Django 中已经包含的几个 CBV,例如 TemplateView 和 FormView。CBV 可以简化常见任务,并提供大量可重用的代码。如果您在正在处理的 Django 项目中使用 CBV,则可以减少开发时间,并使您的代码更模块化且更易于维护。