Django自定义分页类的封装

 1.自定义分页类的封装:

 1 class Pagination(object):
 2     """
 3     基于bootstrap样式的自定义分页类的封装
 4     """
 5     # page_num为每页显示的数量,max_page_num为每页显示的总页码数
 6     def __init__(self, request, lengths, page_num=10, max_page_num=7):
 7 
 8         # 首先进行异常错误处理,比如:.../?page=-5等
 9         try:
10             # 获取url中的page值,并将默认值设置为1
11             page = int(request.GET.get('page', 1))
12             # print(page, type(page))
13             if page < 1:
14                 page = 1
15         except Exception:
16             page = 1
17 
18         # 每页显示的数量
19         # page_num = 7
20 
21         # 计算总页码数
22         # divmod为len(user_list) / page_num,整数为total_num,余数为remainder
23         total_num, remainder = divmod(lengths, page_num)
24         if remainder != 0:
25             total_num += 1
26 
27         # 每页显示的总页码数
28         # max_page_num = 7
29 
30         # 每页显示总页码数一半数
31         half_num = max_page_num // 2
32         # 实际总页码数 < 页面总页码数
33         if total_num < max_page_num:
34             # 页码起始值
35             page_start = 1
36             # 页码终止值
37             page_end = total_num
38         # 实际总页码数 > 页面总页码数
39         else:
40             # 处理左边极值
41             if page - half_num < 1:
42                 page_start = 1
43                 page_end = max_page_num
44             # 处理右边极值
45             elif page + half_num > total_num:
46                 page_start = total_num - max_page_num + 1
47                 page_end = total_num
48             else:
49                 page_start = page - half_num
50                 page_end = page + half_num
51 
52         html_list = ['<nav aria-label="Page navigation"><ul class="pagination pagination-lg">']
53 
54         if page == 1:
55             html_list.append(
56                 '<li class="disabled"><a href="#" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>')
57         else:
58             html_list.append(
59                 '<li><a href="?page=%s" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>' % (page - 1))
60 
61         for i in range(page_start, page_end + 1):
62             if page == i:
63                 html_list.append('<li class="active"><a href="?page=%s">%s</a></li>' % (i, i))
64             else:
65                 html_list.append('<li><a href="?page=%s">%s</a></li>' % (i, i))
66 
67         if page == total_num:
68             html_list.append(
69                 '<li class="disabled"><a href="#" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>')
70         else:
71             html_list.append(
72                 '<li><a href="?page=%s" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>' % (
73                         page + 1))
74 
75         html_list.append('</ul></nav>')
76 
77         self.html_list = ''.join(html_list)
78 
79         # 起始
80         # start = 0
81         self.start = (page - 1) * page_num
82 
83         # 终止
84         # end = 7
85         self.end = page * page_num

2.后端调用

1  def GoodType(request): 
2     resp_data = {}
3     g_type = GoodsType.objects.all()
4     page = Pagination(request,lengths=g_type.count(),page_num=5)
5     resp_data['g_type'] =g_type[page.start:page.end]
6     resp_data['page_html'] = page.html_list
7     return render(request, 'goods/goods_type.html', resp_data)

3.前端使用

1   <div class="row" style="margin-right: 0">{{ page_html|safe }}</div>

效果展示:

 

参考博客:戳这里

 

posted @ 2021-08-10 11:21  千叶千影  阅读(90)  评论(0编辑  收藏  举报