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赋值操作方法分享
Mar 23 Python
Python中动态获取对象的属性和方法的教程
Apr 09 Python
Python列表推导式与生成器表达式用法示例
Feb 08 Python
Python面向对象之静态属性、类方法与静态方法分析
Aug 24 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
python实现自动解数独小程序
Jan 21 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
Jun 14 Python
Python Django框架防御CSRF攻击的方法分析
Oct 18 Python
关于python中的xpath解析定位
Mar 06 Python
在matplotlib中改变figure的布局和大小实例
Apr 23 Python
jenkins+python自动化测试持续集成教程
May 12 Python
OpenCV图片漫画效果的实现示例
Aug 18 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
php XPath对XML文件查找及修改实现代码
2011/07/27 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
2018/12/24 PHP
Mootools 1.2教程 事件处理
2009/09/15 Javascript
Exitjs获取DataView中图片文件名
2009/11/26 Javascript
javascript不同类型数据之间的运算的转换方法
2014/02/13 Javascript
不要使用jQuery触发原生事件的方法
2014/03/03 Javascript
Nodejs进程管理模块forever详解
2014/06/01 NodeJs
javascript实现iframe框架延时加载的方法
2014/10/30 Javascript
JS判断字符串包含的方法
2015/05/05 Javascript
Angularjs中UI Router全攻略
2016/01/29 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
实例详解display:none与visible:hidden的区别
2017/03/30 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
基于jquery实现左右上下移动效果
2018/05/02 jQuery
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
vue实现把接口单独存放在一个文件方式
2020/08/13 Javascript
[04:07]显微镜下的DOTA2第八期——英雄复活动作
2014/06/24 DOTA
python轻松实现代码编码格式转换
2015/03/26 Python
Python中的多重装饰器
2015/04/11 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
解决python3 pika之连接断开的问题
2018/12/18 Python
PyQtGraph在pyqt中的应用及安装过程
2019/08/04 Python
python 通过邮件控制实现远程控制电脑操作
2020/03/16 Python
python 使用递归的方式实现语义图片分割功能
2020/07/16 Python
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
电子商务专员岗位职责
2013/12/11 职场文书
五年后的职业生涯规划
2014/03/04 职场文书
春节联欢会主持词
2014/03/24 职场文书
县级文明单位申报材料
2014/05/23 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
用php如何解决大文件分片上传问题
2021/07/07 PHP
用JS创建一个录屏功能
2021/11/11 Javascript