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画ROC曲线和AUC值计算
Sep 19 Python
python中redis的安装和使用
Dec 04 Python
tensorflow获取变量维度信息
Mar 10 Python
python 多线程对post请求服务器测试并发的方法
Jun 13 Python
python 判断三个数字中的最大值实例代码
Jul 24 Python
python多线程同步之文件读写控制
Feb 25 Python
python实现的汉诺塔算法示例
Oct 23 Python
python和php学习哪个更有发展
Jun 17 Python
django restframework serializer 增加自定义字段操作
Jul 15 Python
Python+Kepler.gl实现时间轮播地图过程解析
Jul 20 Python
详解vscode实现远程linux服务器上Python开发
Nov 10 Python
python实现马丁策略回测3000只股票的实例代码
Jan 22 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 中文处理函数集合
2008/08/27 PHP
PHP设计模式之代理模式的深入解析
2013/06/13 PHP
PHP+MySQL删除操作实例
2015/01/21 PHP
php输出xml属性的方法
2015/03/19 PHP
php连接oracle数据库的方法(测试成功)
2016/05/26 PHP
利用PHP判断文件是否为图片的方法总结
2017/01/06 PHP
一个无限级XML绑定跨框架菜单(For IE)
2007/01/27 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
javascript常用代码段搜集
2014/12/04 Javascript
JS+CSS实现表格高亮的方法
2015/08/05 Javascript
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
非常实用的12个jquery代码片段
2015/11/02 Javascript
如何用angularjs制作一个完整的表格
2016/01/21 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
webpack 2.x配置reactjs基本开发环境详解
2017/08/08 Javascript
Ionic3实现图片瀑布流布局
2017/08/09 Javascript
解决vue props 拿不到值的问题
2018/09/11 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
python uuid模块使用实例
2015/04/08 Python
Go语言基于Socket编写服务器端与客户端通信的实例
2016/02/19 Python
基于python的七种经典排序算法(推荐)
2016/12/08 Python
浅谈用Python实现一个大数据搜索引擎
2017/11/28 Python
Python机器学习之决策树算法
2017/12/22 Python
pymysql模块的操作实例
2019/12/17 Python
Python如何向SQLServer存储二进制图片
2020/06/08 Python
Python StringIO及BytesIO包使用方法解析
2020/06/15 Python
基于python实现可视化生成二维码工具
2020/07/08 Python
审计工作个人的自我评价
2013/12/25 职场文书
外企办公室竞聘演讲稿
2013/12/29 职场文书
庆元旦活动总结
2014/07/09 职场文书
小学生安全教育心得体会
2016/01/15 职场文书
作文之亲情600字
2019/09/23 职场文书
victoriaMetrics库布隆过滤器初始化及使用详解
2022/04/05 Golang
MySQL三种方式实现递归查询
2022/04/18 MySQL