django自定制分页器
自定制一个分页类
class Pagination: def __init__(self, request, current_page, all_data, per_page_num=None, max_page_count=11): per_page_num = per_page_num or 2 try: current_page = int(current_page) except TypeError: # except Exception as e: current_page = 1 if current_page < 1: current_page = 1 self.current_page = current_page # 翻页页码 self.all_count = len(all_data) # 所有数据长度 self.per_page_num = per_page_num # 每页数据条数 # 总页码 divmod返回商和余数, all_pager 除数 tmp余数 all_pager, tmp = divmod(self.all_count, per_page_num) if tmp: all_pager += 1 self.all_pager = all_pager # 数据总页数 self.max_page_count = max_page_count # 最大分页书 self.max_page_count_half = int((max_page_count - 1) / 2) # 最大分页数的一半 self.request = request import copy # 拷贝request中get请求的数据 为下面保存url状态做铺垫 self.params = copy.deepcopy(self.request.GET) ''' all_count=100 per_page_num =10 current_page start end 1 0 10 2 10 20 3 20 30 all_count=100 per_page_num =8 current_page start end 1 0 8 2 8 16 3 16 24 表达式: start= (current_page-1)*per_page_num end =current_page* per_page_num ''' @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.max_page_count: # 显示第一页到最大分页数 if self.current_page <= self.max_page_count_half: page_range = range(1, self.max_page_count+1) # 显示 末页-最大分页数 到 末页 elif(self.current_page+self.max_page_count_half) > self.all_pager: page_range = range(self.all_pager-self.max_page_count+1, self.all_pager+1) # 显示 翻页数前max_page_count_half 和后 max_page_count_half 页 else: page_range = range(self.current_page-self.max_page_count_half, self.current_page+self.max_page_count_half+1) else: # 显示第一页到最后一页 page_range = range(1, self.all_pager + 1) # print(page_range) # 构建分页页面的html page_html_list = [] self.params['page'] = 1 first_page = '<nav aria-label="Page navigation"><ul class="pagination"><li><a href="?%s">首页</a></li>' % ( self.params.urlencode(),) page_html_list.append(first_page) self.params["page"] = self.current_page - 1 if self.current_page <= 1: prev_page = '<li class="disabled"><a href="#">上一页</a></li>' else: prev_page = '<li><a href="?%s">上一页</a></li>' % (self.params.urlencode(),) page_html_list.append(prev_page) for i in page_range: self.params['page'] = i if i == self.current_page: temp = '<li class="active"><a href="?%s">%s</a></li>' % (self.params.urlencode(), i,) else: temp = '<li><a href="?%s">%s</a></li>' % (self.params.urlencode(), i,) page_html_list.append(temp) self.params["page"] = self.current_page + 1 if self.current_page >= self.all_pager: next_page = '<li class="disabled"><a href="#">下一页</a></li>' else: next_page = '<li><a href="?%s">下一页</a></li>' % (self.params.urlencode(),) page_html_list.append(next_page) self.params["page"] = self.all_pager last_page = '<li><a href="?%s">尾页</a></li> </ul></nav>' % (self.params.urlencode()) page_html_list.append(last_page) return ''.join(page_html_list)

浙公网安备 33010602011771号