一.分页器简介
当数据量非常大时, 我们不可能把所有的数据都放在同一页中, 于是就有了分页的概念, 将数据像书一样每一页规定可容纳多少条数据, 运用到Django中的分页组件, 它其实是Django内置的一个类
二.Paginator对象与Page类对象
1.如何得到这两个类对象
- 导入分页类
from django.core.paginator import Paginator
- Paginator类对象
# 语法伪代码
paginator = Paginator([要分页的数据],[每页显示条数])
# 示例
paginator = Paginator(shop_list,10)
- Page类对象
# 语法伪代码
page = paginator.page([第几页])
# 示例
page = paginator.page(2) # 获取第二页对象
2.Paginator类对象属性和方法
- 属性
属性名 | 说明 |
---|---|
count | 返回数据总条数 |
num_pages | 返回分页之后的总页数 |
per_page | 每页显示的条数 |
page_range | 返回分页后页码的列表 |
- 方法
方法名 | 说明 |
---|---|
page(self, number) | 返回地number页的page类实例对象 |
3.Page类对象属性和方法
- 属性
属性名 | 说明 |
---|---|
number | 返回当前页页码 |
object_list | 返回当前页的数据列表 |
paginator | 返回对应的Paginator类对象 |
- 方法
方法名 | 说明 |
---|---|
has_previous( ) | 判断当前页是否有上一页 |
has_next( ) | 判断当前页是否有下一页 |
previous_page_number( ) | 返回前一页页码 |
next_page_number( ) | 返回下一页页码 |
三.创建表并插入数据(准备工作)
1.创建模型类
class Shop(models.Model):
name = models.CharField(max_length=64)
price = models.DecimalField(max_digits=8,decimal_places=2)
nums = models.IntegerField(verbose_name='商品剩余')
def __str__(self):
return self.name
2.使用for循环批量插入数据
for i in range(1,151):
models.Shop.objects.create(name=f'商品{i}',price=10+int(f'{i}'),nums=f'{random.randint(1,15)}')
每循环一次就连接一次数据库, 效率低
3.bulk_create( ) : 批量插入数据
import random
shop_list = []
for i in range(1,151):
book = models.Shop(name=f'商品{i}',price=10+int(f'{i}'),nums=f'{random.randint(1,15)}')
shop_list.append(book)
models.Shop.objects.bulk_create(shop_list,10) # 第二个参数是每次插入的条数
可以指定每次插入的条数, 效率高
4.将初始数据渲染到页面
- page_shop.html 文件
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<div class="panel panel-info">
<div class="panel-heading text-center">商品信息表</div>
<div class="panel-body">
<table class="table table-striped table-hover">
<thead>
<tr>
<th>编号</th>
<th>商品名</th>
<th>价格</th>
<th>剩余个数</th>
</tr>
</thead>
<tbody>
{% for obj in shop_obj %}
<tr>
<th>{{ obj.id }}</th>
<th>{{ obj.name }}</th>
<th>{{ obj.price }}</th>
<th>{{ obj.nums }}</th>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
- 展示效果
以上是没有没有分页的效果, 一页翻不到头, 使用起来不方便
四.分页器完整用法
1.实现需求
- 每页显示15条数据
- 页码列表只展示11页, 随着当前页变化
- 当前页为第一页则禁用''上一页''按钮
- 当前页为最后页则禁用''下一页''按钮
- 当前页按钮处于激活状态
2.效果展示
- 整体展示
- 分页按钮展示
3.代码实现
- 路由层 urls.py 文件
re_path('^page_shop/', views.page_shop)
- 视图层 views.py 文件
视图层需要传给前端使用的三个参数(核心) :
- 分页后的paginator对象,用来展示数据
- 分页后的页码列表,我们规定每次展示11个页码,中间页码为当前页,左右页码随之变化(这里需要注意前11页和后11页)
- 收到前端点击的页码,我们要返回该页码(page)对象(注意小于或超出中页码的情况)
from django.shortcuts import render, HttpResponse, redirect
from app01 import models
def page_shop(request):
#