使用Django实现分页器功能

要使用Django实现分页器,必须从Django中导入Paginator模块

from django.core.paginator import Paginator

假如现在有150条记录要显示,每页显示10条

>>> from django.core.paginator import Paginator#导入Paginator模块
>>> list1=[i for i in range(0,150)]#使用列表生成器生成一个包含150个数字的列表
>>> page1=Paginator(list1,10)#生成一个Paginator对象
>>> print(page1.count)#打印总的记录数,即列表list1的长度
150
>>> print(page1.num_pages)#打印总的页数,即总记录数除以每页显示的条目数
15
>>> print(page1.page_range)#页数的列表
range(1, 16)
>>> print(page1.page(1))#打印第一页的page对象
<Page 1 of 15>
>>> page1.page(1).object_list#打印第一页的所有记录
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> page1.page(2).object_list#打印第二页的所有记录
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> page1.page(2).next_page_number()#打印当前的页(第2页)的下一页的页码
3
>>> page1.page(2).has_next()#第2页是否有下一页
True
>>> page1.page(2).has_previous()#第2页是否有上一页
True
>>> page1.page(2).has_other_pages()#第2是否有其他页
True
>>> page1.page(2).start_index()#第2页第一条记录的序号
11
>>> page1.page(2).end_index()#第2页最后一条记录的序号
20
>>> page1.page(0)#第0页是否有记录,会报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    ...
    raise EmptyPage(_('That page number is less than 1'))
django.core.paginator.EmptyPage: <exception str() failed>
>>> page1.page(15)#打印第15页的对象
<Page 15 of 15>

例子,使用Django实现一个分页效果

后端代码:

#导入render和HttpResponse模块 
from django.shortcuts import render,HttpResponse 
#导入Paginator,EmptyPage和PageNotAnInteger模块 
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def index(request):
    """首页"""

        # 获取Book数据表中的所有记录
    post_list = Post.objects.all()
    print(post_list)

        # 生成paginator对象,定义每页显示10条记录
    paginator = Paginator(post_list, 5)
        # 从前端获取当前的页码数,默认为1
    page = request.GET.get('page', 1)
        # 把当前的页码数转换成整数类型
    currentPage = int(page)

    try:
        print(page)
        post_list = paginator.page(page)  # 获取当前页码的记录
    except PageNotAnInteger:
        post_list = paginator.page(1)  # 如果用户输入的页码不是整数时,显示第1页的内容
    except EmptyPage:
        post_list = paginator.page(paginator.num_pages)  # 如果用户输入的页数不在系统的页码列表中时,显示最后一页的内容

    return render(request,'blog/index.html',locals())

前端代码:

在需要分页的地方加入

{% load staticfiles %}
<div class="container">
    <ul class="pagination" id="pager">
        {#上一页按钮开始#}
        {# 如果当前页有上一页#}
        {% if post_list.has_previous %}
            {#  当前页的上一页按钮正常使用#}
            <li class="previous"><a href="/?page={{ post_list.previous_page_number }}">上一页</a></li>
        {% else %}
            {# 当前页的不存在上一页时,上一页的按钮不可用#}
            <li class="previous disabled"><a href="#">上一页</a></li>
        {% endif %}
        {#上一页按钮结束#}
        {# 页码开始#}
        {% for num in paginator.page_range %}

            {% if num == currentPage %}
                <li class="item active"><a href="/?page={{ num }}">{{ num }}</a></li>
            {% else %}
                <li class="item"><a href="/?page={{ num }}">{{ num }}</a></li>

            {% endif %}
        {% endfor %}
        {#页码结束#}
        {# 下一页按钮开始#}
        {% if post_list.has_next %}
            <li class="next"><a href="/?page={{ post_list.next_page_number }}">下一页</a></li>
        {% else %}
            <li class="next disabled"><a href="#">下一页</a></li>
        {% endif %}
        {# 下一页按钮结束#}
    </ul>
</div>

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小特工作室

1分钟生成Net对象的注释

      我们在开发过程中,肯定会有几个项目作为基础项目,存放一些比较常用的类和方法,供其他项目使用.一般来说,方法实现以后,就不想再去管它了,以致于新加入的...

1726
来自专栏大内老A

如何解决分布式系统中的跨时区问题[原理篇]

《谈谈你最熟悉的System.DateTime[上篇][下篇]》从跨时区的角度对DateTime这个我们熟知的类型进行了深入探讨,它们都是为这篇文章作的准备工作...

1847
来自专栏斑斓

框架 | spray-routing的核心流程

最近我们在一个项目上使用spray来发布restful service。 ? spray是个性能很好而且功能非常完整的service框架,包含很多组件,从底层h...

4036
来自专栏大内老A

WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构

细算起来,已经有好几个月没有真正的写过文章了。近半年以来,一直忙于我的第一本WCF专著《WCF技术剖析》的写作,一直无暇管理自己的Blog。到目前为止《WCF技...

2287
来自专栏java一日一条

同步和异步的区别

答案一: 1.异步传输 通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步...

424
来自专栏GreenLeaves

Web API系列之三 基本功能实现

Web API系列之二讲解了如何搭建一个WebApi的基架,本文主要在其基础之上实现基本的功能.下面开始逐步操作: 一、配置WebApi的路由-用于配置外部如何...

1915
来自专栏Flutter&Dart

DartVM服务器开发(第二十四天)--用户验证(jaguar_session_jwt)

这里要注意,使用该包,需要配合jaguar_jwt,jaguar_auth这两个包使用

1023
来自专栏逸鹏说道

.Net中的AOP系列之构建一个汽车租赁应用(下)

相似地,我们也要在Redeem方法中添加,这里不做了,省略。问题越来越明显了,横切关注点基本上占据了这个方法的一半代码。但是我们还没有做完,我们需要讨论一下异常...

3426
来自专栏CRPER折腾记

Angular 2 + 折腾记 :(7) 初步了解表单:模板驱动及数据驱动及脱坑要点

表单在整个系统中的作用相当重要,这里主要扯下响应表单的实现方式。 首先需要操作表单的模块引入这两个模块; import { FormsModule, React...

592
来自专栏乐享123

再谈以太网帧格式

942

扫码关注云+社区