自定义分页器
自定义分页器
前言:
- web开发的三大框架 django、flask、tornado中,只有django内部封装了一个分页器组件。所以以后用其他框架的时候就得自己写一个。所以封装了一个分页器。
自定义分页器思路:
- 创建处理分页器的类;
- 根据分页码数对所有数据库数据进行切割拿到页面数据;
- 输入分页html,即:[上一页][1][2][3][4][5][下一页]
示例:
- 定义了一个分页器类
class Pagination: def __init__(self, page_num, total_num, per_page_num=10, max_show=11): # 参数说明: # page_num:当前页码数; # total_num:总页码数 # per_page_num:每张页面呈现的数据量 # 页面所有页码数按钮 self.page_num = page_num self.total_num = total_num self.per_page_num = per_page_num self.max_show = max_show self.half_show = self.max_show // 2 self.total_page, more = divmod(total_num, per_page_num) if more: self.total_page += 1 if self.page_num > self.total_page: self.page_num = self.total_page elif self.page_num < 1: self.page_num = 1 @property def start(self): return (self.page_num - 1) * self.per_page_num @property def end(self): return self.page_num * self.per_page_num @property def page_html(self): page_start = self.page_num - self.half_show page_end = self.page_num + self.half_show + 1 if self.page_num + self.half_show >= self.total_page: page_end = self.total_page + 1 page_start = self.total_page - self.max_show + 1 if self.page_num <= self.half_show: page_start = 1 page_end = self.max_show + 1 page_num_list = [] # 添加首页 page_num_list.append('<li><a href="/user_list/?page={0}">首页</a></li>'.format(1)) # 添加上一页 pre_page_num = self.page_num - 1 if pre_page_num < 1: page_num_list.append( '<li class="disabled"><a href="/user_list/?page={0}">上一页</a></li>'.format(pre_page_num)) else: page_num_list.append('<li><a href="/user_list/?page={0}">上一页</a></li>'.format(pre_page_num)) for i in range(page_start, page_end): if i == self.page_num: page_num_list.append('<li class="active"><a href="/user_list/?page={0}">{0}</a></li>'.format(i)) else: page_num_list.append('<li><a href="/user_list/?page={0}">{0}</a></li>'.format(i)) # 添加下一页 next_page_num = self.page_num + 1 if next_page_num > self.total_page: page_num_list.append( '<li class="disabled"><a href="/user_list/?page={0}">下一页</a></li>'.format(next_page_num)) else: page_num_list.append('<li><a href="/user_list/?page={0}">下一页</a></li>'.format(next_page_num)) # 添加尾页 page_num_list.append('<li><a href="/user_list/?page={0}">尾页</a></li>'.format(self.total_page)) # 将所有page_num_list的所有li标签拼接成字符串 传到对应的页面 page_html = ''.join(page_num_list) return page_html
- 在视图函数中实例化一个分页器对象,拿到页面的html。
from . import pagination def xxxxxx(request): try: page_num = int(request.GET.get('page', 1)) #从页面url抓取访问页码数 except Exception: page_num = 1 page_obj =pagination.Pagination(page_num,len(data)) data1 = data[page_obj.start:page_obj.end] return render(request, 'user_list.html', {'user_list': data1, 'page_html': page_obj.page_html})
- 在模板渲染分页器
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="/static/plugins/bootstrap-3.3.7-dist/css/bootstrap.css"> </head> <body> <div class="container"> <table class="table table-bordered"> <thead> <tr> <th>姓名</th> <th>年龄</th> </tr> </thead> <tbody> {% for user in user_list %} <tr> <td>{{ user.name }}</td> <td>{{ user.age }}</td> </tr> {% endfor %} </tbody> </table> </div> <div class="text-center"> <nav aria-label="Page navigation"> <ul class="pagination"> {{ page_html|safe }} </ul> </nav> </div> </body> </html>
这样一个自定义分页器就ok啦。。
浙公网安备 33010602011771号