Django实现翻页的示例代码


Posted in Python onMay 24, 2021

Django提供了翻页器。用Django的Paginator类实现

一、views模块导入Paginator类实现数据分页

ApiTest/apiviews.py

每行都加了注释,希望有助于理解。

from django.shortcuts import render
from ApiTest.models import ApiTest
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger, InvalidPage


@login_required
def api_test_manage(request):
    username = request.session.get('user', '')
    # 获取所有接口测试数据
    apitest_list = ApiTest.objects.all().order_by('id')
    # 生成Paginator对象对数据分页,每页显示10条数据
    paginator = Paginator(apitest_list,10)
    # 使用request.GET.get()函数获取url中的page参数的数值。默认第1页
    page = request.GET.get('page', 1)
    # 把获取的当前页码数转换成整数类型
    current_page = int(page)
    try:
     # 获取查询页数的接口数据列表,page()函数会判断page实参是否是有效数字。page()函数源码附在文章的最后
        apitest_list = paginator.page(page)
    except PageNotAnInteger:
        apitest_list = paginator.page(1)
    except (EmptyPage, InvalidPage):
     # paginator.num_pages
        apitest_list = paginator.page(paginator.num_pages)
    return render(request, "apitest_manage.html", {'user': username, 'apitests': apitest_list})

二、将views的数据渲染到前端模板上

在对应的html文件中加入此段代码即可。

<div class="container">
    <ul class="pagination" id="pager">
        {# 上一页链接 #}
        {% if apitests.has_previous %}
        <li class="previous"><a href="/apitest_manage/?page={{ apitests.previous_page_number }}" rel="external nofollow" >上一页</a></li>
        {% else %}
        <li class="previous disabled"><a href="#" rel="external nofollow"  rel="external nofollow" >上一页</a></li>
        {% endif %}

        {# 中间数字显示 #}
        {%  for num in apitests.paginator.page_range %}
            {%  if num == currentPage %}
                <li class="item active"><a href="/apitest_manage/?page={{ num }}" rel="external nofollow"  rel="external nofollow" >{{ num }}</a></li>
            {% else %}
                <li class="item"><a href="/apitest_manage/?page={{ num }}" rel="external nofollow"  rel="external nofollow" >{{ num }}</a></li>
            {% endif %}
        {% endfor %}

        {# 下一页链接 #}
        {% if apitests.has_next %}   {# 如果有下一页,则正常显示下一页链接 #}
            <li class="next"><a href="/apitest_manage/?page={{ apitests.next_page_number }}" rel="external nofollow" >下一页</a></li>
        {% else %}
            <li class="next disabled"><a href="#" rel="external nofollow"  rel="external nofollow" >下一页</a></li>
        {% endif %}

    </ul>
</div>

三、效果展示

Django实现翻页的示例代码

四、Paginator类源码

此类主要用在views文件

class Paginator:
    def __init__(self, object_list, per_page, orphans=0,
                 allow_empty_first_page=True):
        self.object_list = object_list
        self._check_object_list_is_ordered()
        self.per_page = int(per_page)
        self.orphans = int(orphans)
        self.allow_empty_first_page = allow_empty_first_page

    def validate_number(self, number):
        """Validate the given 1-based page number."""
        try:
            if isinstance(number, float) and not number.is_integer():
                raise ValueError
            number = int(number)
        except (TypeError, ValueError):
            raise PageNotAnInteger(_('That page number is not an integer'))
        if number < 1:
            raise EmptyPage(_('That page number is less than 1'))
        if number > self.num_pages:
            if number == 1 and self.allow_empty_first_page:
                pass
            else:
                raise EmptyPage(_('That page contains no results'))
        return number

    def get_page(self, number):
        """
        Return a valid page, even if the page argument isn't a number or isn't
        in range.
        """
        try:
            number = self.validate_number(number)
        except PageNotAnInteger:
            number = 1
        except EmptyPage:
            number = self.num_pages
        return self.page(number)

    def page(self, number):
        """Return a Page object for the given 1-based page number."""
        number = self.validate_number(number)
        bottom = (number - 1) * self.per_page
        top = bottom + self.per_page
        if top + self.orphans >= self.count:
            top = self.count
        return self._get_page(self.object_list[bottom:top], number, self)

    def _get_page(self, *args, **kwargs):
        """
        Return an instance of a single page.

        This hook can be used by subclasses to use an alternative to the
        standard :cls:`Page` object.
        """
        return Page(*args, **kwargs)

    @cached_property
    def count(self):
        """Return the total number of objects, across all pages."""
        c = getattr(self.object_list, 'count', None)
        if callable(c) and not inspect.isbuiltin(c) and method_has_no_args(c):
            return c()
        return len(self.object_list)

    @cached_property
    def num_pages(self):
        """Return the total number of pages."""
        if self.count == 0 and not self.allow_empty_first_page:
            return 0
        hits = max(1, self.count - self.orphans)
        return ceil(hits / self.per_page)

    @property
    def page_range(self):
        """
        Return a 1-based range of pages for iterating through within
        a template for loop.
        """
        return range(1, self.num_pages + 1)

    def _check_object_list_is_ordered(self):
        """
        Warn if self.object_list is unordered (typically a QuerySet).
        """
        ordered = getattr(self.object_list, 'ordered', None)
        if ordered is not None and not ordered:
            obj_list_repr = (
                '{} {}'.format(self.object_list.model, self.object_list.__class__.__name__)
                if hasattr(self.object_list, 'model')
                else '{!r}'.format(self.object_list)
            )
            warnings.warn(
                'Pagination may yield inconsistent results with an unordered '
                'object_list: {}.'.format(obj_list_repr),
                UnorderedObjectListWarning,
                stacklevel=3
            )

五、Page类源码

此类主要用在html文件

class Page(collections.abc.Sequence):

    def __init__(self, object_list, number, paginator):
        self.object_list = object_list
        self.number = number
        self.paginator = paginator

    def __repr__(self):
        return '<Page %s of %s>' % (self.number, self.paginator.num_pages)

    def __len__(self):
        return len(self.object_list)

    def __getitem__(self, index):
        if not isinstance(index, (int, slice)):
            raise TypeError(
                'Page indices must be integers or slices, not %s.'
                % type(index).__name__
            )
        # The object_list is converted to a list so that if it was a QuerySet
        # it won't be a database hit per __getitem__.
        if not isinstance(self.object_list, list):
            self.object_list = list(self.object_list)
        return self.object_list[index]

    def has_next(self):
        return self.number < self.paginator.num_pages

    def has_previous(self):
        return self.number > 1

    def has_other_pages(self):
        return self.has_previous() or self.has_next()

    def next_page_number(self):
        return self.paginator.validate_number(self.number + 1)

    def previous_page_number(self):
        return self.paginator.validate_number(self.number - 1)

    def start_index(self):
        """
        Return the 1-based index of the first object on this page,
        relative to total objects in the paginator.
        """
        # Special case, return zero if no items.
        if self.paginator.count == 0:
            return 0
        return (self.paginator.per_page * (self.number - 1)) + 1

    def end_index(self):
        """
        Return the 1-based index of the last object on this page,
        relative to total objects found (hits).
        """
        # Special case for the last page because there can be orphans.
        if self.number == self.paginator.num_pages:
            return self.paginator.count
        return self.number * self.paginator.per_page

到此这篇关于Django实现翻页的示例代码的文章就介绍到这了,更多相关Django 翻页内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python字典基本操作实例分析
Jul 11 Python
python自动裁剪图像代码分享
Nov 25 Python
Python实现的自定义多线程多进程类示例
Mar 23 Python
解决DataFrame排序sort的问题
Jun 07 Python
Sanic框架安装与简单入门示例
Jul 16 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
Apr 26 Python
python将数组n等分的实例
Dec 02 Python
python 爬取马蜂窝景点翻页文字评论的实现
Jan 20 Python
基于Python的OCR实现示例
Apr 03 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 Python
Python基础之函数嵌套知识总结
May 23 Python
pytorch 实现变分自动编码器的操作
May 24 Python
pytorch--之halfTensor的使用详解
pandas DataFrame.shift()函数的具体使用
May 24 #Python
教你怎么用python实现字符串转日期
May 24 #Python
pandas中DataFrame重置索引的几种方法
May 24 #Python
pandas取dataframe特定行列的实现方法
pytorch 如何使用amp进行混合精度训练
只需要这一行代码就能让python计算速度提高十倍
You might like
PHP生成压缩文件实例
2015/02/07 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
PHP+Redis事务解决高并发下商品超卖问题(推荐)
2020/08/03 PHP
TNC vs BOOM BO3 第二场2.13
2021/03/10 DOTA
ExtJS下grid的一些属性说明
2009/12/13 Javascript
Javascript 面向对象特性
2009/12/28 Javascript
JavaScript开发规范要求(规范化代码)
2010/08/16 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
JavaScript获取元素尺寸和大小操作总结
2015/02/27 Javascript
js实现时间显示几天前、几小时前或者几分钟前的方法集锦
2015/05/29 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
jQuery中fadein与fadeout方法用法示例
2016/09/16 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
vuejs开发组件分享之H5图片上传、压缩及拍照旋转的问题处理
2017/03/06 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
微信小程序HTTP接口请求封装代码实例
2019/09/05 Javascript
Python正则表达式匹配HTML页面编码
2015/04/08 Python
python2 与 pyhton3的输入语句写法小结
2018/09/10 Python
详解python的argpare和click模块小结
2019/03/31 Python
python pycharm的安装及其使用
2019/10/11 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
浅谈Python 函数式编程
2020/06/20 Python
Python操作MySQL数据库的示例代码
2020/07/13 Python
HTML5之HTML元素扩展(上)—新增加的元素及使用概述
2013/01/31 HTML / CSS
HTML5拖拉上传文件的简单实例
2017/01/11 HTML / CSS
详解如何获取localStorage最大存储大小的方法
2020/05/21 HTML / CSS
求职教师自荐书
2014/06/19 职场文书
司机工作自我鉴定
2014/09/19 职场文书
2014年财务经理工作总结
2014/12/08 职场文书
2016年寒假社会实践活动总结
2015/03/27 职场文书
员工考勤管理制度
2015/08/06 职场文书
员工工作心得体会
2019/05/07 职场文书