美文网首页
1.9 使用基于类的视图

1.9 使用基于类的视图

作者: gznb | 来源:发表于2020-07-20 16:31 被阅读0次

    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 提供的常见类。你可以在 第十章 建立电子学习平台 以及后续几章学习更多有关于 基于类视图的内容。

    相关文章

      网友评论

          本文标题:1.9 使用基于类的视图

          本文链接:https://www.haomeiwen.com/subject/jmjykktx.html