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字符串,数值计算
Oct 05 Python
关于Python中异常(Exception)的汇总
Jan 18 Python
浅谈python配置与使用OpenCV踩的一些坑
Apr 02 Python
解决pycharm无法调用pip安装的包问题
May 18 Python
Python Pandas 获取列匹配特定值的行的索引问题
Jul 01 Python
Python 用三行代码提取PDF表格数据
Oct 13 Python
使用Python的datetime库处理时间(RPA流程)
Nov 24 Python
python opencv如何实现图片绘制
Jan 19 Python
Python super()方法原理详解
Mar 31 Python
Python + selenium + crontab实现每日定时自动打卡功能
Mar 31 Python
面向新手解析python Beautiful Soup基本用法
Jul 11 Python
利用Python实现Json序列化库的方法步骤
Sep 09 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
thinkPHP导出csv文件及用表格输出excel的方法
2015/12/30 PHP
Linux平台PHP5.4设置FPM线程数量的方法
2016/11/09 PHP
Javascript 汉字字节判断
2009/08/01 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
js获取域名的方法
2015/01/27 Javascript
jquery-tips悬浮提示插件分享
2015/07/31 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
Javascript技术难点之apply,call与this之间的衔接
2015/12/04 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
chrome下判断点击input上标签还是其余标签的实现方法
2016/09/18 Javascript
jQuery用noConflict代替$的实现方法
2017/04/12 jQuery
详解Angular 4.x NgIf 的用法
2017/05/22 Javascript
js实现省市级联效果分享
2017/08/10 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
2018/04/26 jQuery
基于jQuery实现的设置文本区域的光标位置
2018/06/15 jQuery
vue.js 实现输入框动态添加功能
2018/06/25 Javascript
如何在vue中使用kindeditor富文本编辑器
2020/12/19 Vue.js
[02:19]2014DOTA2国际邀请赛 专访820少年们一起去追梦吧
2014/07/14 DOTA
python的类方法和静态方法
2014/12/13 Python
python设置值及NaN值处理方法
2018/07/03 Python
python SQLAlchemy的Mapping与Declarative详解
2019/07/04 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
keras 多gpu并行运行案例
2020/06/10 Python
PyCharm2020.1.1与Python3.7.7的安装教程图文详解
2020/08/07 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
突袭HTML5之Javascript API扩展3—本地存储全新体验
2013/01/31 HTML / CSS
5 个强大的HTML5 API 函数推荐
2014/11/19 HTML / CSS
意大利奢侈品网站:Italist
2016/08/23 全球购物
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
校领导推荐信
2013/11/01 职场文书
2014学雷锋活动心得体会
2014/03/10 职场文书
探亲假请假条
2014/04/11 职场文书
房地产推广策划方案
2014/05/19 职场文书
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL
GO语言字符串处理函数之处理Strings包
2022/04/14 Golang