django 分页类


一个关于django分页的类,记录下来,遇到就用,这里用到了bootstrap前端

复制代码
 1 class PageInfo(object):
 2 
 3     def __init__(self, current_page, all_count, per_page, base_url, show_page=11):
 4     """
 5     :param current_page: 当前页码,用request.GET.get('page')方式获取
 6     :param all_count: 数据库总行数
 7     :param per_page:  每页显示的行数
 8     :param show_page:  页面显示多少个页码,默认为 当前页的前5页和后5页一共11页
 9     :param base_url: 动态路径
10     """
11         try:  # 判断一下,如果当前页不是数字,则显示第一页
12             self.current_page = int(current_page)
13         except Exception as e:
14             self.current_page = 1
15         self.per_page = per_page
16 
17         a, b = divmod(all_count, per_page)  # 计算一共有多少页 divmode函数看b是否大于0
18         if b:  # 如果为真,即,b 这个余数大于0,则 页码+1页
19             a = a + 1
20         self.all_pager = a
21         self.show_page = show_page
22         self.base_url = base_url
23 
24     def strat(self):
25         return (self.current_page - 1) * self.per_page
26 
27     def end(self):
28         return self.current_page * self.per_page
29 
30     def pager(self):  # 该函数在前端模板中会自动执行
31         # v = "<a href = '/custom.html?page=1/'>1</a>"
32         # return v
33         page_list = []
34 
35         half = int((self.show_page - 1) / 2)
36 
37         # 如果数据库总页数 < 11
38         if self.all_pager < self.show_page:
39             begin = 1
40             stop = self.all_pager + 1
41         else:  # 如果数据库总页数 > 11
42             # 如果当前页 <=5 , 永远显示1到11页
43             if self.current_page <= half:
44                 begin = 1
45                 stop = self.show_page + 1
46             else:
47                 if self.current_page + half > self.all_pager:
48                     begin = self.all_pager - self.show_page + 1
49                     stop = self.all_pager + 1
50                 else:
51                     begin = self.current_page - half
52                     stop = self.current_page + half + 1
53 
54         # 上一页
55         if self.current_page <= 1:
56             prev = "<li><a href = '#'>上一页</a></li>"
57         else:
58             prev = "<li><a href = '%s?page=%s'>上一页</a></li>" % (
59                 self.base_url, self.current_page - 1)
60         page_list.append(prev)
61 
62         for i in range(begin, stop):
63             if i == self.current_page:
64                 # temp = "<a style='display:inline-block;padding:5px;margin:5px;' href = '%s?page=%s'>%s</a>" % (
65                 temp = "<li class='active'><a href = '%s?page=%s'>%s</a></li>" % (
66                     self.base_url, i, i)
67             else:
68                 temp = "<li><a href = '%s?page=%s'>%s</a></li>" % (
69                     self.base_url, i, i)
70             page_list.append(temp)
71 
72         # 下一页
73         if self.current_page >= self.all_pager:
74             next = "<li><a href = '#'>下一页</a></li>"
75         else:
76             next = "<li><a href = '%s?page=%s'>下一页</a></li>" % (
77                 self.base_url, self.current_page + 1)
78         page_list.append(next)
79 
80         return ''.join(page_list)
81 
82 from utils.pages import PageInfo
复制代码

 


# 函数调用
复制代码
 1 def custom(request):
 2     # 表示用户当前想要访问的页码
 3     # current_page = request.GET.get('page')
 4     # current_page = int(current_page)
 5     all_count = models.UserInfo.objects.all().count()  # 取数据记录总个数
 6     page_info = PageInfo(request.GET.get('page'), all_count, 10, '/custom.html')  # 拿到PageInfo类中的页码信息
 7     user_list = models.UserInfo.objects.all()[page_info.strat():page_info.end()]
 8     # # 每页显示数据的个数
 9     # per_page = 10
10     #
11     # # 1 0:10
12     # # 2 10:20
13     # # 3 20:30
14     # start = (current_page - 1) * per_page
15     # end = current_page * per_page
16 
17     # user_list = models.UserInfo.objects.all()[start:end]
18 
19     return render(request, 'custom.html', {'user_list': user_list, 'page_info': page_info})
复制代码

 

 

# 前端调用

复制代码
 1 <!DOCTYPE html>
 2 <html lang="en">
 3 <head>
 4     <meta charset="UTF-8">
 5     <title>Title</title>
 6     <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css">
 7 </head>
 8 <body>
 9 <ul>
10     {% for row in user_list %}
11         <li>{{ row.name }}</li>
12     {% endfor %}
13 </ul>
14 
15 <nav aria-label="Page navigation">
16     <ul class="pagination">
17         {{ page_info.pager|safe }}
18     </ul>
19 </nav>
20 
21 </body>
22 </html>
复制代码

 



posted @   茶叶蛋蛋  阅读(119)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示