Code前端首页关于Code前端联系我们

Django 开发:自定义分页类和用法概述

terry 2年前 (2023-09-24) 阅读数 93 #后端开发

1。关于为什么需要分页

在处理大量数据时,如果一次性查询数据有响应,必然会对内存和服务器负载产生影响,而且影响会比较低。界面的响应能力,影响用户体验。一种常见的方式是分段向用户显示数据。如果当前段中没有所需数据,您可以通过翻页或输入特定页码来查看其他数据。

Django 提供默认分页功能,但也允许自定义分页以满足特定需求。

2。默认 Django 分页(函数视图)

在视图中,使用 Django 提供的 Paginator 类对数据进行分页。一般与Django的Template

1配合使用。必须实现分页和要分页的数据模型。 ? 4. 在模板模板中使用page_data显示数据并导航分页


<ul>
    {% for post in page_data %}
        <li> {{ post.title }}</li>
    {% endfor %}
</ul>

<br>

<!-- 分页导航 -->
<div class='pagination'>
    {% if page_data.has_previous %}
        <span> 
            <a href="?page=1">&laquo;  首页</a>
            <a href="?page={{ page_data.previous_page_number }}">前一页</a>
        </span>
    {% endif %}
    当前页码: {{ page_data.number }} / {{ page_data.paginator.count }}
    {% if page_data.has_next %}
        <span>
            <a href="?page={{ page_data.next_page_number }}">后一页</a>
            <a href="?page={{ page_data.paginator.num_pages }}">&laquo;  尾页</a>
        </span>
    {% endif %}
</div>

实际效果如下图:Django开发:自定义分页类和使用总结Django模板示例分页实现。类视图)

上面介绍了如何使用Django的函数视图中的分页功能。本文介绍如何使用类视图中的分页功能。

熟悉Django函数视图和类视图的同学很容易认出这一点。如何将上面的函数视图转换为类视图。

其实很简单。类视图中的get()方法的代码逻辑就是上面函数视图中的代码。像这样


class PostListViewDemo(View):
    def get(self, request):
         # 获取数据
        posts = Post.objects.all()

        # 创建Paginator对象
        paginator = Paginator(posts, per_page=3)

        # 或者当前页码 
        page_number = request.GET.get('page', 1)

        # 获取 页码对应的数据
        page_data = paginator.get_page(page_number)
        # 这里输出debug日志,
        print(page_data, type(page_data), dir(page_data))

        # 数据渲染到 template模板中去
        return render(request, 'posts/list2.html', {'page_data': page_data})

主要需要在URL中设置路由。类视图必须使用 as_view()方法如下

from django.urls import path 

from appdemo.views import post_list, PostListViewDemo

urlpatterns = [
    path('list1/', post_list, name='post-list-1'),
    # 注意这里
    path('list2/', PostListViewDemo.as_view(), name='post-list-2'),
]

四、更简单的分页实现 Django 类视图

我们知道它只能用在数据量大的情况下,所以列出的数据在时使用分页。? posts/list3.html无法使用前面两种方法中的自定义对象page_data。请改用固定格式对象 page_obj

具体信息请查看Django源码django.views.generic.list.MultipleObjectMixinget_context_data()get_context_data()源代码说明

因为ListView继承了 MultipleObjectTemplateResponseMixinBaseListView 定义了噀ListView

方法,get 方法调用 context =自我。 get_context_data() 然后 get 返回上下文,方法 get_context_data()MultipleObjectTemplate❙❀ResponseMixin‾5 中定义。关于Django原生自定义分页

默认本例使用Django+Template进行前后端开发。 Django提供的Paginator类已经可以满足日常需求了。

由于对象Page提供了不同情况下的分页操作,这里简单介绍一下属性器的属性❙•分页器。 count 返回所有页面上的对象总数

  • • Paginator.num_pages 返回页面总数
  • • Paginator.page_range 返回从 1 到最大页数的迭代器
  • Method

    • • 。 get_page(page_number)
    • • Paginator.Page(page_number)

    以上两个方法用于获取当前页码对应的数据。区别是:

    1。返回值不同

    1.1,get_page返回一个Page对象,可以用来访问页码和当前页等数据页信息,如下页面属性和方法的总结,

    1.2 返回 page 一个 QuerySet 对象,可以处理普通分页数据。 ? (不会引发异常)

    2.2,page方法会引发PageNotAnInteger或EmptyPage异常,需要在代码中处理。

    页面属性和方法

    属性

    • • Page.object_list 返回当前页码对应的对象列表 • Page.number 返回当前页码
    • • 是对应的 Paginator 对象

    方法

    • • Page.has_next() 当前页面对象是否有另一个页面
    • • Page.has_previous() 当前页面是否有上一个()页面 Page
    • • Page.has_other_pages() 当前Page对象对应的页码是否有上一页或下一页,如果有则返回True
    • • Page.next_page_number() 返回下一页、下一页的页码不存在 如果存在,则报告 InvaliPage
    • • Page.previous_page_number() 返回上一页的页数。如果上一页不存在,则报告InvaliPage
    • • Page.start_index() 返回所有对象中当前页的第一个对象。索引值
    • • Page.end_index() 返回当前页面所有对象中最后一个对象的索引值

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    发表评论:

    ◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

    热门