Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django 实现分页功能

Django 实现分页功能

作者头像
猴哥yuri
发布于 2018-08-16 08:38:18
发布于 2018-08-16 08:38:18
1.6K00
代码可运行
举报
文章被收录于专栏:极客猴极客猴
运行总次数:0
代码可运行

题图:by kacozi from Instagram

当页面因需要展示的数据条目过多,导致无法在一个页面全部显示。这时,页面经常会采用分页形式进行展示,然后每页显示 20 或者 50 等条数据。分页经常在网站上随处可见,它大概是这样子:

点击查看大图

这样的实现不仅提高了用户体验,还是减轻数据库读取数据的压力。Django 自带名为 Paginator 的分页工具, 方便我们实现分页功能。本文就讲解如何使用 Paginator 实现分页功能。

1 Paginator

Paginator 类的作用是将我们需要分页的数据分割成若干份。当我们实现化一个 Paginator 类的实例时,需要给 Paginator 传入两个参数。第一个参数是数据源,可以是一个列表、元组、以及查询结果集 QuerySet。第二个参数需要传入一个整数,表示每页显示数据条数。具体写法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
book_list = []
for x in range(1, 26):  # 一共 25 本书
    book_list.append('Book ' + str(x))
# 将数据按照规定每页显示 10, 进行分割
paginator = Paginator(book_list, 10)

上面代码中,我们传入一个名为 book_list 的列表,该列表中含有 25 本书,然后我们给 Paginator 设定每页显示 10 条数据,最后得到一个 Paginator 实例。

另外 Paginator 类中有三个常用的属性,它们分别是:

  • count:表示所有页面的对象总数。
  • num_pages: 表示页面总数。
  • page_range: 下标从 1 开始的页数范围迭代器。

2 Page 对象

Paginator 类提供一个 page(number) 函数,该函数返回就是一个 Page 对象。参数 number 表示第几个分页。如果 number = 1,那么 page() 返回的对象是第一分页的 Page 对象。在前端页面中显示数据,我们主要的操作都是基于 Page 对象。具体用法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 使用  paginator 对象返回第 1 页的 page 对象
books = paginator.page(1)

Page 对象有三个常用的属性:

  • object_list: 表示当前页面上所有对象的列表。
  • number: 表示当前页的序号,从 1 开始计数。
  • paginator: 当前 Page 对象所属的 Paginator 对象。

除此之外,Page 对象还拥有几个常用的函数:

  • has_next(): 判断是否还有下一页,有的话返回True。
  • has_previous():判断是否还有上一页,有的话返回 True。
  • has_other_pages():判断是否上一页或下一页,有的话返回True。
  • next_page_number(): 返回下一页的页码。如果下一页不存在,抛出InvalidPage 异常。
  • previous_page_number():返回上一页的页码。如果上一页不存在,抛出InvalidPage 异常。

3 运用

下面是自己编写的 demo 程序,介绍 Paginator 和 Page 如何一起使用。

3.1 视图

在 views.py 获取需要展示的全部数据,然后使用 Paginator 类对数据进行分页,最后返回第 1 页面的 page 对象。page 对象的作用巨大,一方面展示当前分页数据,还提供获取后续页面数据的接口。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage, InvalidPage
from django.http import HttpResponse
from django.shortcuts import render

def paginator_view(request):
    book_list = []
    '''
    数据通常是从 models 中获取。这里为了方便,直接使用生成器来获取数据。
    '''
    for x in range(1, 26):  # 一共 25 本书
        book_list.append('Book ' + str(x))

    # 将数据按照规定每页显示 10, 进行分割
    paginator = Paginator(book_list, 10)

    if request.method == "GET":
        # 获取 url 后面的 page 参数的值, 首页不显示 page 参数, 默认值是 1
        page = request.GET.get('page')
        try:
            books = paginator.page(page)
        # todo: 注意捕获异常
        except PageNotAnInteger:
            # 如果请求的页数不是整数, 返回第一页。
            books = paginator.page(1)
        except InvalidPage:
            # 如果请求的页数不存在, 重定向页面
            return HttpResponse('找不到页面的内容')
        except EmptyPage:
            # 如果请求的页数不在合法的页数范围内,返回结果的最后一页。
            books = paginator.page(paginator.num_pages)

    template_view = 'page.html'
    return render(request, template_view, {'books': books})

3.2 模板

模板的工作就是在 HTML 页面中填充数据。当拿到视图传递过来的 books(books 是一个 Page 对象), 就在 for 循环中打印数据。最后使用 books 根据页面情况展示上一页按钮,当前页数,总页数,下一页按钮。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{% load staticfiles %}
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
    <meta charset="UTF-8">
    <link href="{% static 'css/bootstrap.min.css' %}" rel="stylesheet">
    <script src="{% static 'js/jquery.min.js' %}"></script>
    <script src="{% static 'js/bootstrap.min.js' %}"></script>
    <title>分页</title>
</head>

<br>
    <div class="text-center" >
        {% for book in books %}
            <span>书名: {{ book }} <br /></span>
        {% endfor %}
    </div>

    {# 实现分页标签的代码 #}
    {# 这里使用 bootstrap 渲染页面 #}
    <div id="pages" class="text-center" >
        <nav>
            <ul class="pagination">
                <li class="step-links">
                {% if books.has_previous %}
                    <a class='active' href="?page={{ books.previous_page_number }}">上一页</a>
                {% endif %}

                <span class="current">
                    Page {{ books.number }} of {{ books.paginator.num_pages }}</span>

                {% if books.has_next %}
                    <a class='active' href="?page={{ books.next_page_number }}">下一页</a>
                {% endif %}
                </li></ul></nav></div>
</body>
</html>

3.3 运行结果

我在 urls.py 中配置当前的 app 访问路径是 paginator/。所以使用浏览器访问地址 http://127.0.0.1:8000/paginator/, 看到访问结果如下:

点击查看大图

点击查看大图

点击查看大图

4 写在最后

我新建 Python Web 学习交流 QQ 群,群号:701534112。或者长按以下二维码加群。欢迎大家加群,一起交流,一起学习。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客猴 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python Django开发 经验技巧总结(一)
该功能运用了django.contrib.messages这个库,在django项目中setting.py文件中APP注册部分自定义注册
cutercorley
2020/07/23
1.4K0
Python Day18 Django
这样,下次再访问时通过获取cookie中的"sessionid"的值就可以得到所对应的session-data
py3study
2020/01/14
1.2K0
Python进阶31-Django 分页器
-多年互联网运维工作经验,曾负责过大规模集群架构自动化运维管理工作。 -擅长Web集群架构与自动化运维,曾负责国内某大型金融公司运维工作。 -devops项目经理兼DBA。 -开发过一套自动化运维平台(功能如下): 1)整合了各个公有云API,自主创建云主机。 2)ELK自动化收集日志功能。 3)Saltstack自动化运维统一配置管理工具。 4)Git、Jenkins自动化代码上线及自动化测试平台。 5)堡垒机,连接Linux、Windows平台及日志审计。 6)SQL执行及审批流程。 7)慢查询日志分析web界面。
DriverZeng
2022/09/26
1.6K0
Python进阶31-Django 分页器
django分页方法
类Paginator: class Paginator(object_list,per_page,orphans=0,allow_empty_first_page=True)
一朵灼灼华
2022/08/05
2970
django 1.8 官方文档翻译:13-6 分页
Django提供了一些类来帮助你管理分页的数据 – 也就是说,数据被分在不同页面中,并带有“上一页/下一页”标签。这些类位于django/core/paginator.py中。
ApacheCN_飞龙
2022/11/27
4310
django 自带分页功能
1. https://doc.codingdict.com/django/topics/pagination.html
卓越笔记
2023/02/16
9720
django 自带分页功能
44. Django 2.1.7 分页 Paginator
Django提供了数据分页的类,这些类被定义在django/core/paginator.py中。
Devops海洋的渔夫
2022/01/17
3900
44. Django 2.1.7 分页 Paginator
程序员笔记|三步实现Django Paginator 分页
Django提供了一个新的类来帮助管理分页数据,这个类存放在django/core/paginator.py.它可以接收列表、元组或其它可迭代的对象。本文将分三步介绍Django Paginator 分页的实现步骤。
宜信技术学院
2019/07/02
3380
程序员笔记|三步实现Django Paginator 分页
Django分页器
分页功能是所有网页上都需要提供的功能,当要展示的条目比较多时,就需要进行分页,不但能减小数据库读取数据压力,也有利于用户浏览。 Django为我们提供了一个Paginator分页工具,这个类帮助我们来管理分页数据,该类存放在django/core/paginator.py它可以接收列表、元组或其他可迭代对象。
py3study
2020/01/20
7930
Django---分页器、中间件
分页 Django的分页器(paginator) view from django.shortcuts import render,HttpResponse # Create your views here. from app01.models import * from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger def index(request): ''' 批量导入数据: Boo
用户1214487
2018/01/24
5400
Django---分页器、中间件
几个实现分页的方法
自定义方法 def user_list(request): # user_list = data[0:10] # user_list = data[10:20] try: current_page = int(request.GET.get("page")) except Exception as e: current_page = 1 per_page = 10 # 数据总条数 total_count = len
新人小试
2018/04/12
9070
几个实现分页的方法
django 写测试工具用到的 paginator 分页
作者:郭佳明 导语 之前写CC的测试平台的时候,里面有一个机器管理列表信息,使用表格来展示的,数据量大概有240多条,需要用到分页。之前没有接触bootstrap table,而是网上随便找了一个表格
serena
2017/07/31
9390
python测试开发django-115.Paginator分页器展示table表格数据
bootstrap 分页功能可以看菜鸟教程https://www.runoob.com/bootstrap/bootstrap-pagination.html
上海-悠悠
2021/09/14
9880
Django分页器的用法
Django中利用orm实现批量插入一般有两种方式:单条插入或者利用bulk_create批量插入
仙人技术
2021/08/31
1.1K0
拓展 Django Pagination 实现完善的分页效果
在 使用 Django Pagination 实现简单的分页功能 中,我们实现了一个简单的分页导航效果。但想实现下面这样的一个比较完善的分页导航时,Django Pagination 内置的 API 已经无法满足需求。本文将通过拓展 Django Pagination 来实现下图这样比较完善的分页效果。 image.png 分页效果概述 一个比较完善的分页效果应该具有以下特性,就像上图展示的那样,很多网站都采用了类似这种的分页导航方式。 始终显示第一页和最后一页 当前页码高亮显示 显示当前页码前后几个连续
追梦人物
2018/04/17
2K0
拓展 Django Pagination 实现完善的分页效果
13.Django基础之django分页
  我们使用脚本批量创建一些测试数据(将下面的代码保存到bulk_create.py文件中放到Django项目的根目录,直接执行即可。):
changxin7
2019/10/14
9330
Paginator 简单分页
#views.py def login_log(req):        try:         winlog_list = login_log.objects.filter(username=username).order_by('-logintime')#数据库信息         after_range_num = 5         before_range_num = 4#前4后4         page=int(req.GET.get('page','1'))#获取page,默认为1    
一朵灼灼华
2022/08/05
3320
通过 Django Pagination 实现简单分页
当博客上发布的文章越来越多时,通常需要进行分页显示,以免所有的文章都堆积在一个页面,影响用户体验。
HelloGitHub
2021/05/14
9680
Django 使用Paginator分页器
上方的分页代码还有一个不足之处,当我们的页码数量过多时,会全部展示出来,整个页面都是很不美观,我们直接在上方代码上稍加修改一下试试.
王瑞MVP
2022/12/28
1.2K0
Django 使用Paginator分页器
django list类型数据分页
有一个django项目,由于业务要求,自己构造了一个list数据类型。这是一个临时数据,不需要保存到表中,但是需要分页展示。
py3study
2020/04/21
8130
相关推荐
Python Django开发 经验技巧总结(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验