成果展现,依据以后页码显示前后各5页,有首页和尾页,上一页和下一页
pytho代码
新建py文件:pageination.py
"""自定义分页组件"""from django.utils.safestring import mark_safeclass Pageination(object): """ :param request: 申请的对象 :param queryset: 符合条件的数据(依据这个数据给他进行分页解决) :param page_size: 每页显示多少条数据 :param page_param: 在URL中传递的获取分页的参数,例如:/etty/list/?page=12 :param plus: 显示当前页的 前或后几页(页码) """ def __init__(self, request, queryset, page_size=10, page_param='page', plus=5): page = request.GET.get('page', 1) # 判断是否为字符串十足 if page.isdecimal(): page = int(page) else: page = 1 # 获取当前页 self.page = page # 每页显示条数 self.page_size = page_size # 起始页 self.start = (page - 1) * page_size # 完结页 self.end = page * page_size self.page_queryset = queryset[self.start:self.end] # 总条数 total_count = queryset.count() total_page_count, div = divmod(total_count, page_size) # 获取整除数 与 余数 if div: total_page_count += 1 # 总页码 self.total_page_count = total_page_count # 显示页码数 self.plus = plus def html(self): # 计算出当前页前5页,和后5页 if self.total_page_count <= 2 * self.plus + 1: start_page = 1 end_page = self.total_page_count else: # 数据地面的数据表较多 >11 if self.page <= self.plus: start_page = 1 end_page = 2 * self.plus + 1 else: if (self.page + self.plus) > self.total_page_count: start_page = self.total_page_count - 2 * self.plus end_page = self.total_page_count else: start_page = self.page - self.plus end_page = self.page + self.plus + 1 # 生成页码 page_str_list = [] # 首页 page_str_list.append('<li><a href="?page=1">首页</a></li>') # 上一页 if self.page > 1: prev = f'<li><a href="?page={self.page - 1}">上一页</a></li>' else: prev = f'<li><a href="?page={1}">上一页</a></li>' page_str_list.append(prev) for i in range(start_page, end_page + 1): if i == self.page: ele = f'<li class="active"><a href="?page={i}">{i}</a></li>' else: ele = f'<li><a href="?page={i}">{i}</a></li>' page_str_list.append(ele) # 下一页 if self.page < self.total_page_count: prev = f'<li><a href="?page={self.page + 1}">下一页</a></li>' else: prev = f'<li><a href="?page={self.total_page_count}">下一页</a></li>' page_str_list.append(prev) # 尾页 page_str_list.append(f'<li><a href="?page={self.total_page_count}">尾页</a></li>') # 输出页码跳转 search_string = """ <form method="get"> <div class="input-group"> <input type="text" name="page" class="form-control" placeholder="Search for..."> <span class="input-group-btn"> <button class="btn btn-default" type="submit">跳转</button> </span> </div> </form> """ page_str_list.append(search_string) # 转换为HTML元素 page_string = mark_safe(''.join(page_str_list)) return page_string
调用页码:
page_object = Pageination(request, queryset) context = { 'queryset': page_object.page_queryset, 'search_data': search_data, # 分完页的数据 'page_string': page_object.html(), # 页码 }return render(request, 'pretty_list.html', context)
html中应用
<nav aria-label="Page navigation"> <ul class="pagination"> {{ page_string }} </ul></nav>