首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Django之通用视图

很多视图反映基本的 Web 开发中的一个常见情况:根据 URL 中的参数从数据库中获取数据、载入模板文件然后返回渲染后的模板。 由于这种情况特别常见,Django 提供一种快捷方式,叫做“通用视图”系统。

通用视图将常见的模式抽象化,可以使你在编写应用时甚至不需要编写Python代码。

让我们将我们的投票应用转换成使用通用视图系统,这样我们可以删除许多我们的代码。我们仅仅需要做以下几步来完成转换,我们将:

转换 URLconf。

删除一些旧的、不再需要的视图。

基于 Django 的通用视图引入新的视图。

一般来说,当编写一个 Django 应用时,你应该先评估一下通用视图是否可以解决你的问题,你应该在一开始使用它,而不是进行到一半时重构代码。本教程目前为止是有意将重点放在以“艰难的方式”编写视图,这是为将重点放在核心概念上。

就像在使用计算器之前你需要掌握基础数学一样。

改良 URLconf

首先,打开这个 URLconf 并将它修改成:

polls/urls.py

fromdjango.urlsimportpath

from.importviews

app_name='polls'

urlpatterns=[ path('', views.IndexView.as_view(), name='index'), path('/', views.DetailView.as_view(), name='detail'), path('/results/', views.ResultsView.as_view(), name='results'), path('/vote/', views.vote, name='vote'),]

注意,第二个和第三个匹配准则中,路径字符串中匹配模式的名称已经由改为。

改良视图

下一步,我们将删除旧的,, 和视图,并用 Django 的通用视图代替。打开文件,并将它修改成:

polls/views.py

fromdjango.httpimportHttpResponseRedirect

fromdjango.shortcutsimportget_object_or_404, render

fromdjango.urlsimportreverse

fromdjango.viewsimportgeneric

from.modelsimportChoice, Question

classIndexView(generic.ListView): template_name='polls/index.html'context_object_name='latest_question_list'defget_queryset(self):

"""Return the last five published questions."""returnQuestion.objects.order_by('-pub_date')[:5]

classDetailView(generic.DetailView): model=Question template_name='polls/detail.html'

classResultsView(generic.DetailView): model=Question template_name='polls/results.html'

defvote(request, question_id):

...# same as above, no changes needed.

我们在这里使用两个通用视图:和。这两个视图分别抽象“显示一个对象列表”和“显示一个特定类型对象的详细信息页面”这两种概念。

每个通用视图需要知道它将作用于哪个模型。 这由属性提供。

期望从 URL 中捕获名为的主键值,所以我们为通用视图把改成。

默认情况下,通用视图使用一个叫做的模板。在我们的例子中,它将使用模板。

属性是用来告诉 Django 使用一个指定的模板名字,而不是自动生成的默认名字。 我们也为列表视图指定了—— 这确保 results 视图和 detail 视图在渲染时具有不同的外观,即使它们在后台都是同一个。

类似地,使用一个叫做的默认模板;我们使用来告诉使用我们创建的已经存在的模板。

在之前的教程中,提供模板文件时都带有一个包含和变量的 context。对于,变量会自动提供—— 因为我们使用 Django 的模型 (Question), Django 能够为 context 变量决定一个合适的名字。然而对于 ListView, 自动生成的 context 变量是。为了覆盖这个行为,我们提供属性,表示我们想使用。作为一种替换方案,你可以改变你的模板来匹配新的 context 变量 —— 这是一种更便捷的方法,告诉 Django 使用你想使用的变量名。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180804G19MJU00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券