首先需要明确的是,get请求/post请求都可以携带参数,所以在朝后端发送数据时,可以携带一个参数告诉后端我们想看第几页的数据。
还有一点就是,queryset对象支持索引和切片操作,但是不支持负数索引情况。
后端通过get方式实现分页功能,每次切换页的时候,会刷新页面。
后端通过post方式实现分页功能,每次切换页的时候,不会刷新页面,只会重新渲染下一页的内容。
简单推导:
这里的推导在get方法中不需要用,有封装好的代码,在post方法中,需要用到下面的推导
current_page = request.GET.get("page",1) # 获取用户想访问的页码(默认为 1 )
try:
current_page = int(current_page)
except Exception as e:
current_page = 1
# 前端传过来的数据类型为字符串,所以要做异常捕获,将字符串转为整形
# 还需要定义页面到底展示几条数据
per_page_num = 10 # 一页展示10条数据
# 需要对总数据进行切片操作 需要确定切片起始位置和终止位置
start_page = ?
end_page = ?
"""
下面需要研究current_page、per_page_num、start_page、end_page四个参数之间的数据关系
per_page_num = 10
current_page start_page end_page
1 0 10
2 10 20
3 20 30
4 30 40
per_page_num = 5
current_page start_page end_page
1 0 5
2 5 10
3 10 15
4 15 20
"""
可以很明显的看出规律
start_page = (current_page - 1) * per_page_num
# 开始条数为 :(要看的页数-1)*每页展示的条数
end_page = current_page* per_page_num
# 结束条数为 : (要看的页数)*每页展示的条数
get方法实现分页器功能:
1 将下面代码直接复制:
class Pagination(object):
def __init__(self, current_page, all_count, per_page_num=2, pager_count=11):
"""
封装分页相关数据
:param current_page: 当前页
:param all_count: 数据库中的数据总条数
:param per_page_num: 每页显示的数据条数
:param pager_count: 最多显示的页码个数
"""
try:
current_page = int(current_page)
except Exception as e:
current_page = 1
if current_page < 1:
current_page = 1
self.current_page = current_page
self.all_count = all_count
self.per_page_num = per_page_num
# 总页码
all_pager, tmp = divmod(all_count, per_page_num)
if tmp:
all_pager += 1
self.all_pager = all_pager
self.pager_count = pager_count
self.pager_count_half = int((pager_count - 1) / 2)
@property
def start(self):
return (self.current_page - 1) * self.per_page_num
@property
def end(self):
return self.current_page * self.per_page_num
def page_html(self):
# 如果总页码 < 11个:
if self.all_pager <= self.pager_count:
pager_start = 1
pager_end = self.all_p