Django分页器的用法你都了解吗


Posted in Python onMay 26, 2021

Django是一个大而全的框架。需要明确的是,传参进行分页获取分页后的数据,一般都是通过向服务器发送get请求的方式实现的,在向后端服务发送查看数据的同时可以携带一个或多个参数并发送get请求来实现分页查看功能

前面总结过drf框架中分页器的使用,本文主要介绍在利用Django开发MVT模型项目时分页器的使用

1、准备基础数据

设计表模型

为了体现分页的效果,需要先创建一个表并准备较多数据,模型如下

from django.db import models

# Create your models here.

class Book(models.Model):
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=9, decimal_places=2)  # 9999999.99

执行数据库迁移后,设计一个视图函数,通过触发视图函数往此表中批量插入数据

Django中利用orm实现批量插入一般有两种方式:单条插入或者利用bulk_create批量插入

最终翻译转换成sql语句也就类似于多条insert语句和一条insert的区别

def create_book(request):

    # 批量插入方式一
    for i in range(100):
        Book.objects.create(title="book"+str(i),price=i*i)
		# 批量插入方式二
    book_list = []
    for i in range(100):
        book = Book(title="book"+str(i),price=i*i)
        book_list.append(book)
    Book.objects.bulk_create(book_list)
    
    return HttpResponse("添加成功")

2、一次性展示数据

接下来通过模板语法一次性将数据展示到前端页面

视图函数如下

def get_books(request):
    book_list = Book.objects.all()
    return render(request, "index.html", {"book_list": book_list})

模板页面index.html如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<ul>
    {% for book in book_list %}
    <li>{ book.title } : { book.price }</li>
    {% endfor %}
</ul>
</body>
</html>

这时一次性访问即展示了所有的book

3、引入分页器

引入分页器后,可以对全局分页对象和单页对象进行相关操作,相关语法

# 引入分页器
from django.core.paginator import Paginator

		...
    # 全局分页器对象
    paginator = Paginator([1,2,3,4,5,6,7,8,9,10],3)
    print(paginator.count) # 10  数据总数
    print(paginator.num_pages)  # 4  总页数
    print(paginator.page_range) # range(1, 5)  页码的列表

    # 单页对象
    page = paginator.page(2)
    print(page.has_next())  # 是否有下一页
    print(page.next_page_number())  # 写一页的页码
    print(page.has_previous())  # 是否有上一页
    print(page.previous_page_number())  # 上一页的页码
    # 取出单页对象的值
    print(page.object_list) # [4, 5, 6]
    for i in page:
       print(i)

在这里的例子中具体使用分页器及模板语法,例如每页取出8条,获取用户给出的页码条件数,返回相应页的数据,默认不给出任何条件时返回第一页的数据

from django.core.paginator import Paginator
   # 取出当前用户页码
   current_num = int(request.GET.get("page", 1))
   book_list = Book.objects.all()
   paginator = Paginator(book_list, 8)
   page = paginator.page(current_num)
  
   return render(request,"index.html",{"page":page})

最后,可以利用bootstrap组件在页面模板中添加翻页的按钮,在当前页时按钮加深,没有上一页时禁止点击

...
<body>

<ul>
    {% for book in page %}
    <li>{ book.title } : { book.price }</li>
    {% endfor %}
</ul>
<nav aria-label="Page navigation">
  <ul class="pagination">
    {% if page.has_previous %}
    <li>
      <a href="/?page={ page.previous_page_number }" rel="external nofollow"  aria-label="Previous">
        <span aria-hidden="true">上一页</span>
      </a>
    </li>
    {% else %}
    <li class="disabled">
      <a href="#" rel="external nofollow"  rel="external nofollow"  aria-label="Previous">
        <span aria-hidden="true">上一页</span>
      </a>
    </li>
    {% endif %}
      {% for num in page_range %}
      {% if num == current_num %}
          <li class="active"><a href="/?page={ num }" rel="external nofollow"  rel="external nofollow" >{ num }</a></li>
      {% else %}
          <li><a href="/?page={ num }" rel="external nofollow"  rel="external nofollow" >{ num }</a></li>
      {% endif %}
      {% endfor %}
    <li>
      <a href="#" rel="external nofollow"  rel="external nofollow"  aria-label="Next">
        <span aria-hidden="true">下一页</span>
      </a>
    </li>
  </ul>
</nav>
</body>
...

在视图函数中:处理相关异常;传递相关参数;当页码较多时只显示部分页码,例如最多时总共10个页码,当前页码始终在中间显示;单独处理出现边界情况,负数页码的情况及最大页码用完的情况

from django.core.paginator import Paginator
		...
    # 取出当前用户页码
    current_num = int(request.GET.get("page", 1))
    book_list = Book.objects.all()
    paginator = Paginator(book_list, 8)
    page = paginator.page(current_num)

    # 大于11页时
    if paginator.num_pages > 11:
        # 当前页码的后5页数超过最大页码时,显示最后10项
        if current_num + 5 > paginator.num_pages:
            page_range = range(paginator.num_pages - 10, paginator.num_pages + 1)
        # 当前页码的前5页数为负数时,显示开始的10项
        elif current_num - 5 < 1:
            page_range = range(1, 12)
        else:
            # 显示左5页到右5页的页码
            page_range = range(current_num - 5, current_num + 5 + 1)
    # 小于11页时显示所有页码
    else:
        page_range = paginator.page_range

    return render(request, "index.html", {"page": page, "paginator": paginator, "current_num": current_num, "page_range": page_range})

以上就是Django分页器的用法你都了解吗?的详细内容,更多关于Django分页器的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python迭代器的使用方法实例
Nov 21 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
Jun 14 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
python验证码识别实例代码
Feb 03 Python
Django使用详解:ORM 的反向查找(related_name)
May 30 Python
学生信息管理系统Python面向对象版
Jan 30 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
Linux下升级安装python3.8并配置pip及yum的教程
Jan 02 Python
Python 解决火狐浏览器不弹出下载框直接下载的问题
Mar 09 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
django 将自带的数据库sqlite3改成mysql实例
Jul 09 Python
利用python绘制正态分布曲线
Jan 04 Python
tensorflow中的梯度求解及梯度裁剪操作
May 26 #Python
python numpy中multiply与*及matul 的区别说明
May 26 #Python
python文本处理的方案(结巴分词并去除符号)
Django操作cookie的实现
May 26 #Python
pandas中DataFrame检测重复值的实现
python 中的@运算符使用
May 26 #Python
Python 实现定积分与二重定积分的操作
May 26 #Python
You might like
检查url链接是否已经有参数的php代码 添加 ? 或 &amp;
2010/02/09 PHP
PHP检测字符串是否为UTF8编码的常用方法
2014/11/21 PHP
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
微信小程序 获取设备信息 API实例详解
2016/10/02 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
Vue.use源码分析
2017/04/22 Javascript
基于jquery的on和click的区别详解
2018/01/15 jQuery
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
[01:18:21]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
python处理圆角图片、圆形图片的例子
2014/04/25 Python
Linux下使用python调用top命令获得CPU利用率
2015/03/10 Python
解决Pytorch 训练与测试时爆显存(out of memory)的问题
2019/08/20 Python
Python 异常的捕获、异常的传递与主动抛出异常操作示例
2019/09/23 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
Python猴子补丁Monkey Patch用法实例解析
2020/03/23 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
利用pandas向一个csv文件追加写入数据的实现示例
2020/04/23 Python
如何用PyPy让你的Python代码运行得更快
2020/12/02 Python
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
机械专业应届生求职信
2013/09/21 职场文书
实验教师岗位职责
2014/02/13 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
《中国梦我的梦》中学生演讲稿
2014/08/20 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
解除施工合同协议书
2014/10/17 职场文书
学前班学生评语
2014/12/29 职场文书
2015年政务公开工作总结
2015/05/19 职场文书
2015年语言文字工作总结
2015/07/23 职场文书
结婚纪念日感言
2015/08/01 职场文书