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 相关文章推荐
PHP魔术方法__ISSET、__UNSET使用实例
Nov 25 Python
在IIS服务器上以CGI方式运行Python脚本的教程
Apr 25 Python
Python操作MongoDB数据库PyMongo库使用方法
Apr 27 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
May 25 Python
Python编程中归并排序算法的实现步骤详解
May 04 Python
Python实现的文本简单可逆加密算法示例
May 18 Python
matplotlib绘制动画代码示例
Jan 02 Python
Centos 升级到python3后pip 无法使用的解决方法
Jun 12 Python
Django添加KindEditor富文本编辑器的使用
Oct 24 Python
python 动态迁移solr数据过程解析
Sep 04 Python
Python使用eval函数执行动态标表达式过程详解
Oct 17 Python
用Python实现屏幕截图详解
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
MySQL数据源表结构图示
2008/06/05 PHP
php下过滤html代码的函数 提高程序安全性
2010/03/02 PHP
PHP中使用unset销毁变量并内存释放问题
2012/07/05 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
php微信开发之谷歌测距
2018/06/14 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
javascript中字符串拼接需注意的问题
2010/07/13 Javascript
jQuery的实现原理的模拟代码 -3 事件处理
2010/08/03 Javascript
基于jquery的弹出提示框始终处于窗口的居中位置(类似于alert弹出框的效果)
2011/09/28 Javascript
javascrpt绑定事件之匿名函数无法解除绑定问题
2012/12/06 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
JS实现自动固定顶部的悬浮菜单栏效果
2015/09/16 Javascript
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
JS实现的排列组合算法示例
2019/07/16 Javascript
微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)
2019/07/25 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
VUE实时监听元素距离顶部高度的操作
2020/07/29 Javascript
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
Python中运算符&quot;==&quot;和&quot;is&quot;的详解
2016/10/08 Python
Python编写一个优美的下载器
2018/04/15 Python
Python常见MongoDB数据库操作实例总结
2018/07/24 Python
Pycharm+Python工程,引用子模块的实现
2020/03/09 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
党委书记岗位职责
2013/11/24 职场文书
上学迟到的检讨书
2014/01/11 职场文书
服务承诺口号
2014/05/22 职场文书
趣味运动会策划方案
2014/06/02 职场文书
水污染治理工程专业自荐信
2014/06/21 职场文书
体育课外活动总结
2014/07/08 职场文书
2014年社区卫生工作总结
2014/12/18 职场文书
2015年设计师个人工作总结
2015/04/25 职场文书
宾馆客房管理制度
2015/08/06 职场文书
优胜劣汰,强者为王——读《鲁滨逊漂流记》有感
2019/08/15 职场文书
用python开发一款操作MySQL的小工具
2021/05/12 Python
python playwright 自动等待和断言详解
2021/11/27 Python