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 相关文章推荐
django自定义Field实现一个字段存储以逗号分隔的字符串
Apr 27 Python
查看Python安装路径以及安装包路径小技巧
Apr 28 Python
Python爬取网页中的图片(搜狗图片)详解
Mar 23 Python
python如何为被装饰的函数保留元数据
Mar 21 Python
python3+PyQt5实现文档打印功能
Apr 24 Python
使用python爬取B站千万级数据
Jun 08 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
简单了解Python3里的一些新特性
Jul 13 Python
如何使用Python发送HTML格式的邮件
Feb 11 Python
Keras使用tensorboard显示训练过程的实例
Feb 15 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
python归并排序算法过程实例讲解
Nov 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
使用sockets:从新闻组中获取文章(二)
2006/10/09 PHP
PHP中的cookie
2006/11/26 PHP
PHP连接access数据库
2008/03/27 PHP
PHP中的日期加减方法示例
2014/08/21 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
HR vs CL BO3 第二场 2.13
2021/03/10 DOTA
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
jquery 表单验证之通过 class验证表单不为空
2015/11/02 Javascript
在WordPress中加入Google搜索功能的简单步骤讲解
2016/01/04 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
JavaScript 控制字体大小设置的方法
2016/11/23 Javascript
基于BootStrap栅格栏系统完成网站底部版权信息区
2016/12/23 Javascript
详解Vue.js入门环境搭建
2017/03/17 Javascript
基于nodejs 的多页面爬虫实例代码
2017/05/31 NodeJs
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
apache部署python程序出现503错误的解决方法
2017/07/24 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
python对csv文件追加写入列的方法
2019/08/01 Python
Python 实现遥感影像波段组合的示例代码
2019/08/04 Python
Python实现AI自动抠图实例解析
2020/03/05 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
css3 transform属性详解
2014/09/30 HTML / CSS
Ray-Ban雷朋美国官网:全球领先的太阳眼镜品牌
2016/07/20 全球购物
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
面包店的创业计划书范文
2014/01/16 职场文书
工作表现评语
2014/01/19 职场文书
运动会通讯稿200字
2015/07/20 职场文书
2016年公司新年寄语
2015/08/17 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
使用pd.merge表连接出现多余行的问题解决
2022/06/16 Python