使得基于类的视图

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
喜欢就支持一下吧
点赞10 分享