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 相关文章推荐
Windows和Linux下使用Python访问SqlServer的方法介绍
Mar 10 Python
python实现将pvr格式转换成pvr.ccz的方法
Apr 28 Python
总结Python编程中三条常用的技巧
May 11 Python
Python 中开发pattern的string模板(template) 实例详解
Apr 01 Python
Python外星人入侵游戏编程完整版
Mar 30 Python
Python基于QRCode实现生成二维码的方法【下载,安装,调用等】
Jul 11 Python
Python cv2 图像自适应灰度直方图均衡化处理方法
Dec 07 Python
超简单使用Python换脸实例
Mar 27 Python
用Cython加速Python到“起飞”(推荐)
Aug 01 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
Nov 08 Python
使用scrapy ImagesPipeline爬取图片资源的示例代码
Sep 28 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
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
jQuery chili图片远处放大插件
2009/11/30 Javascript
jquery 无限级下拉菜单的简单实现代码
2014/02/21 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
2014/09/01 Javascript
jQuery简单实现网页选项卡特效
2014/11/24 Javascript
js 实现数值的千分位及保存小数方法(推荐)
2016/08/01 Javascript
解决AjaxFileupload 上传时会出现连接重置的问题
2017/07/07 Javascript
详解vue-cli快速构建vue应用并实现webpack打包
2017/12/13 Javascript
AngularJS模态框模板ngDialog的使用详解
2018/05/11 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
node.js连接mysql与基本用法示例
2019/01/05 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
Python简单实现enum功能的方法
2016/04/25 Python
Python中index()和seek()的用法(详解)
2017/04/27 Python
python 内置函数filter
2017/06/01 Python
python中使用%与.format格式化文本方法解析
2017/12/27 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
python之pyqt5通过按钮改变Label的背景颜色方法
2019/06/13 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
全球最大的游戏市场:G2A
2018/07/05 全球购物
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
“学雷锋活动月”总结
2014/03/09 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
十佳中学生事迹材料
2014/06/02 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
学校食堂标语
2014/10/06 职场文书
党的群众路线教育实践活动个人整改落实情况汇报
2014/10/28 职场文书
如何写好闭幕词
2019/04/02 职场文书
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
MySQL创建管理HASH分区
2022/04/13 MySQL