1.请求
2.分页数据即可
""" 自定义的分页组件 使用方法: views中 def number_list(request): if request.method == 'GET': # 根据条件筛选需要的数据 numbers = PrettyNumber.objects.all().order_by('-level') # 调用分页器类进行自动分页 生成分页器对象 调用html方法 渲染页面即可 page_obj = Pagination(request, numbers) page_string = page_obj.html() return render(request, 'number_list.html', locals()) html中 <!--数据的展示--> {% for i in page_obj.page_queryset %} <tr> <td> {{ i.id }}</td> <td> {{ i.mobile }}</td> <td> {{ i.price }}</td> <td>{{ i.get_level_display }}</td> <td>{{ i.get_status_display }}</td> <td> <a class="btn btn-primary btn-xs" href="/number/edit/{{ i.id }}">编辑</a> <a class="btn btn-danger btn-xs" href="/number/delete/?nid={{ i.id }}">删除</a> </td> </tr> {% endfor %} <!--分页--> <nav aria-label="..."> <ul class="pagination"> {{ page_string }} </ul> </nav> """ from django.utils.safestring import mark_safe class Pagination(object): def __init__(self, request, queryset, page_size=10, page_params='page', plus=5): """ request:请求 queryset:需要分页符合条件的数据 page_size:每页数据个数 默认为10 page_params:查询字符串的名称 默认为page plus:每页前面显示几页 后面显示几页 """ page = request.GET.get(page_params, 1) from django.http.request import QueryDict import copy query_dic = copy.deepcopy(request.GET) # 默认request.GET不能修改,深拷贝一份就可以修改 query_dic._mutable = True # 还需要该改下 拷贝出来的._mutable属性 self.page_params = page_params # 设置 page_params 分页查询字符串的key self.query_dic = query_dic # 设置 query_dic拷贝出来的复件 为 属性 # query_dic.setlist('page', [1111]) # print(request.GET.urlencode()) # 如果是一个十进制规范数字 当前页码为规范数字 try: page.isdigit() page = int(page) print(page, type(page)) # 不是 规范输入 设置当前页码为1 except: 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] # 每页数据的内容 # 总的数据数量 self.total_count = queryset.count() total_page_count, div = divmod(self.total_count, self.page_size) if div: total_page_count += 1 self.total_page_count = total_page_count # 总页码页码数量 self.plus = plus # 展示前几条 后几条数据 def html(self): # 定义一个page_str_list用来装载html数据 page_str_list = [] # 数据库数据比较少 没有达到11页 即 2*plus + 1页 显示的内容设置为固定显示 if self.total_page_count <= 2 * self.plus + 1: start_page = 1 end_page = self.total_page_count # 数据库的数据比较多,达到11页,考虑小时候的极值,和大时候的极值判断 设置对应的显示内容为固定显示开始或者结束 else: # 小的时候的极值 设置起始页面为1 结束页面动态选择 if self.page <= self.plus: start_page = 1 end_page = 2 * self.plus + 1 # 当前页 > 5 (plus) else: # 判断大的时候的极值 当前页+plus>最大页面数的时候出问题 设置起始页面为最大页面数-2*plus 结束页码为最大页码数 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 # ?后面的查询字符串 self.query_dic.setlist(self.page_params, [1]) # 首页 html标签 注意不能添加查询字符串前面的url,否则其他的就不能使用 home_page = '<li class="page-item"><a class="page-link disabled" href="?{}">HomePage</a></li>'.format(self.query_dic.urlencode()) page_str_list.append(home_page) # 上一页 html标签 if self.page <= 1: self.query_dic.setlist(self.page_params, [1]) prev = '<li class="page-item"><a class="page-link disabled" href="?{}">Previous</a></li>'.format(self.query_dic.urlencode()) else: self.query_dic.setlist(self.page_params, [self.page-1]) prev = '<li class="page-item"><a class="page-link" href="?{}">Previous</a></li>'.format(self.query_dic.urlencode()) page_str_list.append(prev) # 中间页码 html标签 for i in range(start_page, end_page + 1): # for range前取后不取,所以需要给结束页码+1 self.query_dic.setlist(self.page_params, [i]) if i == self.page: # active 为深蓝色选中状态 ele = '<li class="page-item active" aria-current="page" ><a class="page-link" href="?{}">{}</a></li>'.format(self.query_dic.urlencode(), i) else: # 需要标记该字符串为安全的 导入marksafe 后面为字符串的格式化 ele = '<li class="page-item"><a class="page-link" href="?{}">{}</a></li>'.format(self.query_dic.urlencode(), i) page_str_list.append(ele) # 下一页 html标签 if self.page >= self.total_page_count: self.query_dic.setlist(self.page_params, [self.total_page_count]) Next = '<li class="page-item"><a class="page-link" href="?{}">Next</a></li>'.format(self.query_dic.urlencode()) else: self.query_dic.setlist(self.page_params, [self.page + 1]) Next = '<li class="page-item"><a class="page-link" href="?{}">Next</a></li>'.format(self.query_dic.urlencode()) page_str_list.append(Next) # 尾页 html标签 self.query_dic.setlist(self.page_params, [self.total_page_count]) trailer_page = '<li class="page-item"><a class="page-link disabled" href="?{}">TrailerPage</a></li>'.format(self.query_dic.urlencode()) page_str_list.append(trailer_page) # 搜索 html标签 search_string = """ <li> <!-- 页面跳转 --> <form method="get" style="float:left; margin-left: -1px" > <div class="input-group" style="width: 200px"> <input type="text" name="page" style="position: relative; float: left; display: inline-block; width: 00px; border-radius: 0" class="form-control" placeholder="页码"> <span class="input-group-btn"> <button class="btn btn-default" type="submit">Jump</button> </span> </div> </form> </li> """ page_str_list.append(search_string) # 将page_string传递给后端 page_string = mark_safe("".join(page_str_list)) return page_string