分页需求分析:
1, 最多显示10页
2, 当页数是第一页时,不显示上一页
3, 当页数是最后一页,不显示下一页。
4, 当页数是1到6时,始终显示1到10页。
5, 当页数是最后5页是,始终显示最后10页。
6, 当页数在中间的时候 ,即不是前5页,也不是最后5页时,当前页始终显示在中间。起始和结束页,随着当前页的变化而变化。
7, 直接输入页码,直接调到相应的页面。
分析
问题转换为,找到起始页码和结束页码。 5 = 10 / 2
1 2 3 4 5 6 7 8 9 10 当前页在1到6时,始终显示1--10
2 3 4 5 6 7 8 9 10 11 第七页, start = 7-5 end = 7+ 4 = 7 + 5 -1
3 4 5 6 7 8 9 10 11 12 第8页 start = 8-5 end = 8+5-1
4 5 6 7 8 9 10 11 12 13 当页数9 10 11 12 13时,start = 4 = 13 - 10 + 1 end = 最大页数
最多显示10页,如果只有5页呢。?
永远都是显示1 2 3 4 5
总页数,小于最大显示页数。
伪代码。
约定:
显示的最大页数: max_page
当前页: current_page
最大页数: num_pages
起始页: start
结束页: end
已知:max_page ,current_page,num_pages求start,end
中间值 middle = max_page / 2
if num_pages < max_page:
start = 1
end = num_pages
else:
if current_page <= middle:
start = 1
end = max_page
elif current_page> middle & current_page < num_pages - middle + 1
start = current_page - middle
end = current_page + middle -1
else:
start = num_pages - max_page +1
end = num_pages
return start, end
# 实现自定义分页
import math
def custom_paginator(current_page, num_page, max_page=10):
middle = math.ceil(max_page / 2)
# 一种特殊情况
# 总页数,小于最大页数
if num_page < max_page:
start = 1
end = num_page
else:
# 一般情况
# 当前页在头部的时候
if current_page <= middle:
start = 1
end = max_page
# 当前页在中间时
elif (current_page > middle) & (current_page < num_page - middle + 1):
start = current_page - middle
end = current_page + middle - 1
else:
# 当前页在尾部
start = num_page - max_page + 1
end = num_page
return start, end