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>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了