django实现分页的两种形式
一、django内置方法实现分页
django自带的分页不能设置样式
def domen(request): # for i in range(101): # models.DataInfo.objects.create(name="root_%s"%i,phone=11111) #获取url中cur_page的参数 cur_page=request.GET.get('cur_page') cur_page=int(cur_page) data_list=models.DataInfo.objects.all() from django.core.paginator import Paginator paginatos=Paginator(data_list,10) # per_page: 每页显示条目数量 # count: 数据总个数 # num_pages:总页数 # page_range:总页数的索引范围,如: (1,10),(1,200) # page: page对象 # res=paginatos.count # res=paginatos.num_pages # res=paginatos.page_range # res=paginatos.page(2).number users=paginatos.page(cur_page) # has_next 是否有下一页 # next_page_number 下一页页码 # has_previous 是否有上一页 # previous_page_number 上一页页码 # object_list 分页之后的数据列表 # number 当前页 # paginator paginator对象 return render(request,'domen.html',{"users":users})
<div class="box"> <ul> {% for user in users %} <li> {{ user.name }} {% endfor %} </li> </ul> {#获取上一页#} {% if users.has_previous %} <a href="/domen/?cur_page={{ users.previous_page_number }}">上一页</a> {% endif %} {#获取页码#} {% for num in users.paginator.page_range %} <a href="/domen/?cur_page={{ num }}">{{ num }}</a> {% endfor %} {#获取下一页#} {% if users.has_next %} <a href="/domen/?cur_page={{ users.next_page_number }}">下一页</a> {% endif %} </div>
二、自定义页面分页
1、处理页数的方法
class PageInfo: '''页数处理类''' #total 总的数据为列表套对象 #cur_page 前端发过来的当前页码 #per_page 一页展示的数据的条数 #show_page 显示页面下端页码显示的数目 def __init__(self,total,cur_page,per_page=10,show_page=11): a,b=divmod(total,per_page) if b!=0: a+=1 self.total=total self.cur_page=cur_page self.per_page=per_page self.show_page=show_page self.total_page_num=a #获取数据库查询的起始位置 self.start = (cur_page - 1) * per_page #获取数据库的结束位置 self.end = self.start + per_page #获取当前页起始数据的位置 def get_start_num(self): return self.start #获取数据库结束数据的位置 def get_end_num(self): return self.end def get_page(self): #获得距离当前页的数量,用于展示页数多少 step=self.show_page//2 #展示页起始点 begin=self.cur_page-step off = self.cur_page + step #判断开始页是否小于0等于0,或小于等于0,开始开始页始终设置为1 if begin<=0: begin=1 #判断最后的几页是否还凑步数 elif self.total_page_num-self.cur_page<=step: off=self.total_page_num #判断若总的页数小于需要展示的页数 if self.total_page_num<self.show_page: off=self.total_page_num lis=[] #判断当前页是否为第一页,若为第一次就不能点击上一页 if self.cur_page-1<=0: str="<li><a href='#'><span aria-hidden='true'>«</span></a></li>" else: str="<li><a href='/index/?cur_page=%s' aria-label='Previous'><span aria-hidden='true'>«</span></a></li>"%(self.cur_page-1) lis.append(str) #遍历获取页数标签 for index in range(begin,off+1): if self.cur_page==index: str="<li><a href='/index/?cur_page=%s' style='background:blue;color:white;'>%s</a></li>"%(index,index) else: str="<li><a href='/index/?cur_page=%s'>%s</a></li>"%(index,index) lis.append(str) if self.cur_page>=self.total_page_num: str="<li><a href='#'><span aria-hidden='true'>»</span></a></li>" else: str="<li><a href='/index/?cur_page=%s' aria-label='Previous'><span aria-hidden='true'>»</span></a></li>"%(self.cur_page+1) lis.append(str) s=" ".join(lis) return s
2、分页处理模型类
class IndexPage(View): '''分页模型类''' def get(self,request): #获取当前页这里是字符创格式 cur_page=request.GET.get('cur_page') #将字符创格式的cur_page转化成数字类型 cur_page=int(cur_page) # total=models.DataInfo.objects.all()[0:10] #获取数据库数据总数量 total=models.DataInfo.objects.filter(id__lt=40).count() #实例化页数处理类的对象 page_obj=PageInfo(total,cur_page) start=page_obj.get_start_num() end=page_obj.get_end_num() #对数据库查出的数据进行切片 users=models.DataInfo.objects.all()[start:end] s=page_obj.get_page() return render(request,'index.html',{"user_lis":users,"page":s})
3、分页模板
<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"> <style> .page{ text-align: center; } </style> <table class="table-bordered table"> <p class="btn btn-primary">欢迎光临</p> <thead> <tr> <th>ID</th> <th>姓名</th> <th>电话</th> </tr> </thead> <tbody> {% for user in user_lis %} <tr> <td>{{ user.id }}</td> <td>{{ user.name }}</td> <td>{{ user.phone }}</td> </tr> {% endfor %} </tbody> </table> <div class="page"> <nav aria-label="Page navigation"> <ul class="pagination"> {{ page | safe }} </ul> </nav> </div>