准备工作
为测试分页使用的数据库准备好300条测试数据
1 2 3 for i in range (300 ): name = "Venti%s" %i models.UserInfo.objects.create(name=name)
cur_page 当前页面序号
内置分页
前端通过 https://localhost:8000/?cur_page=666 分割获取到cur_paged的数值
处理含有非法分页数字的请求 1 2 3 4 5 6 7 8 9 10 11 12 def index (request ): try : cur_page = request.GET.get('cur_page' ) cur_page = int (cur_page) except Exception as e: cur_page = 1 user_list = models.UserInfo.objects.all ()
生成一个分页器对象 1 2 pagiantor = Paginator(user_list,10 )
内置分页器的一些属性和参数
per_page 每页显示条目的数量 count 数据的总个数 num_pages 总页数 page_range 总页数的索引范围 page page对象
1 2 print (paginator.per_page, paginator.count, paginator.num_pages)
分页后的页面对象 1 users = paginator.page(cur_page)
页面对象的一些属性或方法
has_next 是否有下一页 next_page_number 下一页页码 has_previous 是否有上一页 previous_page_number 上一页页码 object_list 分页之后的数据列表 number 当前页 paginator paginator对象
自定制分页类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 class PageInfo (): def __init__ (self,cur_page,total,per_page=10 ,show_page=11 ): try : self.cur_page = int (cur_page) except Exception as e: self.cur_page = 1 self.per_page = per_page self.show_page = show_page a , b = divmod (total,per_page) if b: self.total_page = a + 1 else : self.total_page = a def get_start (self ): return (self.cur_page - 1 ) * self.per_page def get_stop (self ): return self.cur_page * self.per_page def page (self ): half = int ((self.show_page ) / 2 ) if self.total_page < self.show_page: begin = 1 stop = self.total_page + 1 else : if self.cur_page - 1 < half: begin = 1 stop = self.show_page + 1 elif self.cur_page + half > self.total_page: begin = self.total_page - self.show_page + 1 stop = self.total_page + 1 else : begin = self.cur_page - half stop = self.cur_page + half + 1 sli = [] if self.cur_page == 1 : s = "<li class='disabled'><a href='#'>上一页</a></li>" else : s = "<li><a href='/custom/?cur_page=%s'>上一页</a></li>" %(self.cur_page - 1 ) sli.append(s) for num in range (begin, stop): if num == self.cur_page: s = "<li class='active'><a href='/custom/?cur_page=%s'>%s</a></li>" %(num, num) else : s = "<li><a href='/custom/?cur_page=%s'>%s</a></li>" %(num, num) sli.append(s) if self.cur_page == self.total_page: s = "<li class='disabled'><a href='#'>下一页</a></li>" else : s = "<li><a href='/custom/?cur_page=%s'>下一页</a></li>" % (self.cur_page + 1 ) sli.append(s) page_str = " " .join(sli) return page_str
调用自定制分页类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 def custom (request ): cur_page = request.GET.get('cur_page' ) total = models.UserInfo.objects.count() pageinfo = PageInfo(cur_page, total) start = pageinfo.get_start() stop = pageinfo.get_stop() user_list = models.UserInfo.objects.all ()[start:stop] return render(request, "custom.html" ,{"user_list" :user_list, "pageinfo" :pageinfo})
前端代码 第一版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <!DOCTYPE html > <html > <head > <meta charset ="utf-8" > <title > Title</title > </head > <body > <ul > {% for user in user_list.object_list %} <li > {{ user.name }}</li > {% endfor %} </ul > {% if user_list.has_previous %} <a href ="/index/?cur_page={{ user_list.previous_page_number }}" > 上一页</a > {% endif %} {% for num in user_list.paginator.page_range %} {% if num == user_list.number %} <a style ="display: inline-block; padding: 5px; margin: 5px;background-color: red" href ="/index/?cur_page={{ num }}" > {{ num }}</a > {% else %} <a style ="display: inline-block; padding: 5px; margin: 5px;" href ="/index/?cur_page={{ num }}" > {{ num }}</a > {% endif %} {% endfor %} {% if user_list.has_next %} <a href ="/index/?cur_page={{ user_list.next_page_number }}" > 下一页</a > {% endif %} </body > </html >
前端代码 第二版 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 <!DOCTYPE html > <html > <head > <meta charset ="utf-8" > <title > Title</title > <link rel ="stylesheet" href ="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity ="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin ="anonymous" > </head > <body > <ul > {% for user in user_list %} <li > {{ user.name }}</li > {% endfor %} </ul > <nav aria-label ="Page navigation" > <ul class ="pagination" > {{ pageinfo.page | safe }} </ul > </nav > </body > </html >