之前参考前辈实现的分页组件,还ok。
介绍:
基于Web,实现分页样式 和 控制页面内容数据的展示形式。
实现:
1 from django.utils.safestring import mark_safe 2 3 class Pagination(object): 4 def __init__(self, current_page, all_count, base_url, query_params, per_page=20, pager_page_count=11): 5 """ 6 分页初始化 7 :param current_page: 当前页码 8 :param per_page: 每页显示数据条数 9 :param all_count: 数据库中总条数 10 :param base_url: 基础URL 11 :param query_params: QueryDict对象,内部含所有当前URL的原条件 12 :param pager_page_count: 页面上最多显示的页码数量 13 """ 14 self.base_url = base_url 15 try: 16 self.current_page = int(current_page) 17 if self.current_page <= 0: 18 raise Exception() 19 except Exception as e: 20 self.current_page = 1 21 self.query_params = query_params 22 self.per_page = per_page 23 self.all_count = all_count 24 self.pager_page_count = pager_page_count 25 pager_count, b = divmod(all_count, per_page) 26 if b != 0: 27 pager_count += 1 28 self.pager_count = pager_count 29 30 half_pager_page_count = int(pager_page_count / 2) 31 self.half_pager_page_count = half_pager_page_count 32 33 @property 34 def start(self): 35 """ 36 数据获取值起始索引 37 :return: 38 """ 39 return (self.current_page - 1) * self.per_page 40 41 @property 42 def end(self): 43 """ 44 数据获取值结束索引 45 :return: 46 """ 47 return self.current_page * self.per_page 48 49 def page_html(self): 50 """ 51 生成HTML页码 52 :return: 53 """ 54 # 如果数据总页码pager_count<11 pager_page_count 55 if self.pager_count < self.pager_page_count: 56 pager_start = 1 57 pager_end = self.pager_count 58 else: 59 # 数据页码已经超过11 60 # 判断: 如果当前页 <= 5 half_pager_page_count 61 if self.current_page <= self.half_pager_page_count: 62 pager_start = 1 63 pager_end = self.pager_page_count 64 else: 65 # 如果: 当前页+5 > 总页码 66 if (self.current_page + self.half_pager_page_count) > self.pager_count: 67 pager_end = self.pager_count 68 pager_start = self.pager_count - self.pager_page_count + 1 69 else: 70 pager_start = self.current_page - self.half_pager_page_count 71 pager_end = self.current_page + self.half_pager_page_count 72 73 page_list = [] 74 75 if self.current_page <= 1: 76 prev = '<li><a href="#">上一页</a></li>' 77 else: 78 self.query_params['page'] = self.current_page - 1 79 prev = '<li><a href="%s?%s">上一页</a></li>' % (self.base_url, self.query_params.urlencode()) 80 page_list.append(prev) 81 for i in range(pager_start, pager_end + 1): 82 self.query_params['page'] = i 83 if self.current_page == i: 84 tpl = '<li class="active"><a href="%s?%s">%s</a></li>' % ( 85 self.base_url, self.query_params.urlencode(), i,) 86 else: 87 tpl = '<li><a href="%s?%s">%s</a></li>' % (self.base_url, self.query_params.urlencode(), i,) 88 page_list.append(tpl) 89 90 if self.current_page >= self.pager_count: 91 nex = '<li><a href="#">下一页</a></li>' 92 else: 93 self.query_params['page'] = self.current_page + 1 94 nex = '<li><a href="%s?%s">下一页</a></li>' % (self.base_url, self.query_params.urlencode(),) 95 page_list.append(nex) 96 page_str = "".join(page_list) 97 return mark_safe(page_str)