介绍&代码

之前参考前辈实现的分页组件,还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)
原文地址:https://www.cnblogs.com/steven2020/p/10741229.html