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学习笔记(二)基础语法
Jun 06 Python
Python中input和raw_input的一点区别
Oct 21 Python
python类中super()和__init__()的区别
Oct 18 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
Jan 30 Python
python3学习笔记之多进程分布式小例子
Feb 13 Python
Python基于Floyd算法求解最短路径距离问题实例详解
May 16 Python
pytorch 把MNIST数据集转换成图片和txt的方法
May 20 Python
基于Python 中函数的 收集参数 机制
Dec 21 Python
解析PyCharm Python运行权限问题
Jan 08 Python
Django 解决阿里云部署同步数据库报错的问题
May 14 Python
Python Scrapy图片爬取原理及代码实例
Jun 12 Python
Python 如何实现文件自动去重
Jun 02 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设计模式编程中的简单工厂模式
2016/02/29 PHP
学习PHP session的传递方式
2016/06/15 PHP
PHP实现登陆表单提交CSRF及验证码
2017/01/24 PHP
php/JS实现的生成随机密码(验证码)功能示例
2019/06/06 PHP
php7下的filesize函数
2019/09/30 PHP
Laravel框架Eloquent ORM简介、模型建立及查询数据操作详解
2019/12/04 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
JavaScript中for循环的几种写法与效率总结
2017/02/03 Javascript
浅谈js中function的参数默认值
2017/02/20 Javascript
通过npm引用的vue组件使用详解
2017/03/02 Javascript
详解vue服务端渲染(SSR)初探
2017/06/19 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
js+canvas实现验证码功能
2020/09/21 Javascript
Vuejs学习笔记之使用指令v-model完成表单的数据双向绑定
2019/04/29 Javascript
微信小程序修改数组长度的问题的解决
2019/12/17 Javascript
深入理解redux之compose的具体应用
2020/01/12 Javascript
如何在vue中使用jointjs过程解析
2020/05/29 Javascript
在python win系统下 打开TXT文件的实例
2018/04/29 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
2019/03/27 Python
redis数据库及与python交互用法简单示例
2019/11/01 Python
python实现图像随机裁剪的示例代码
2020/12/10 Python
设计毕业生简历中的自我评价
2013/10/01 职场文书
协议书的格式
2014/04/23 职场文书
给客户的检讨书
2014/12/21 职场文书
公务员政审材料范文
2014/12/23 职场文书
社区党风廉政建设调研报告
2015/01/01 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
公司管理制度范本
2015/08/03 职场文书
公司仓库管理制度
2015/08/04 职场文书
Java Optional<Foo>转换成List<Bar>的实例方法
2021/06/20 Java/Android
基于JavaScript实现年月日三级联动
2021/06/22 Javascript