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>