Django提供了视图基类,继承自View类,并用于处理HTTP方法调度和其它常见功能。
基于类的视图的优点:
- 在独立的方法中组织与HTTP方法相关的代码,如GET/POST或PUT。
- 采用多重继承创建可复用的视图类(也称作混入类)
官方文档:https://docs.djangoproject.com/zh-hans/3.0/topics/class-based-views/intro/
下面把post_list视图修改为基于类的视图,并使用Django提供的通用ListView。这一基视图可显示任意类型的对象。
一、views.py修改视图类
编辑blog应用程序的views.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'
在上述代码中,将通知ListView执行下列操作:
- 使用特定的QuerySet,而不是检索全部对象。此外并未定义queryset属性,而是采用了特定的model=Post,Django将构建通用的Post.objects.all() QuerySet。
- 针对查询结果使用上下文变量posts。如果未指定context_object_name,那么默认变量为object_list。
- 最终结果经分页后每页显示3个对象。
- 使用自定义模板渲染当前页面。如果未设置默认模板,则ListView将使用blog/post_list.html。
二、urls.py修改PostListView类添加URL
urlpatterns = [
# post views
# 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 %}
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END