1.9 使用基于类的视图
1. 使用基于类的视图
基于类的视图是将 视图 实现为 Python 对象而不是函数的另一种方法。因为视图时可以调用的,它接受一个 web 请求 并且返回一个 web 响应。你也可以把你的视图定义为一个类方法。Django 为这个提供了一个 基础类视图。所有的这些都是继承于 View
类的,它处理 HTTP 方法的调度,和其他常见的功能。
在某一些用例中,基于类的视图比基于函数的视图更有优势,它们具有以下特点:
- 将HTTP 方法 例如
GET
,POST
,PUT
相关的代码组织到单独的方法中,而不是使用条件分支。 - 使用多继承的方式去创建可重用的类视图。(也被成为
mixins
)
你可以在这个链接中了解更多有关 基于类的 视图的介绍。
你把 post_list
视图改变成基于类的视图,以使用 Django 提供的 通用 ListView
。这个基本视图允许您列出任何类型的对象。
在你的 blog
应用程序中编辑 view.py
文件,并且添加下面的代码:
from django.views.generic import ListView
class PostListView(ListView):
queryset = Post.published.all()
context_object_name = 'posts'
paginate_by = 3
template_name = 'blog/post/list.html'
这个 基于类的视图类似于之前的 post_list
视图,在上面的代码中,你要求 ListView
去做下面的事情:
- 使用定制的 查询集 而不是 检索所有对象。你可以不定义
querysets
属性,而是 指定model=Post
,Django 将为您构建通用的Post.objects.all()
查询集。 - 为 查询结果使用
posts
上下文变量。如果你没有指定context_object_name
, 默认的变量就是object_list
。 - 结果分页显示,每个页面三个对象。
- 使用定制的模板去渲染页面。如果你没有设置一个 默认的 模板,
ListView
将 使用blog/post_list.html
现在打开你 blog
应用程序的 urls.py
文件,注释掉前面的 post_list
URl 模式,并且使用PostListView
添加一个新的 URl 模式,如下所示:
urlpatterns = [
# 文章视图
# path('', views.post_list, name='post_list'),
path('', views.PostListView.as_view(), name='post_list'),
path('<int:year>/<int:month>/<int:day>/<slug:post>/', views.post_detail, name='post_detail')
]
为保持分页工作,你必须使用传递给模板的正确页面对象。 Django 的 ListView
通用视图 通过一个名为 page_obj
的变量传递选定的页面。 所以,你必须编辑您的 post/list.html
模板,以便使用正确的变量包含分页器。
{% include "pagination.html" with page=page_obj %}
在你的 浏览器中打开 http://127.0.0.1:8000/blog/
,并且去验证所有的工作方式是否与前面的 post_list
使用相同。这是一个简单的基于类视图的例子,它使用 Django 提供的常见类。你可以在 第十章 建立电子学习平台 以及后续几章学习更多有关于 基于类视图的内容。