—Django内置分页
内置分页包含2个重要对象:paginator和page对象,分别封装了分页的一些对象属性,实质上是2个类属性的实例化
首先从django.core.paginator中引入模块
from django.core.paginator import Paginator,EmptyPage,PageNotAnInteger
//Paginator接收2个参数,数据库中的所有数据和你设置的每页显示的数据个数
def divid_page1(request):
paginator=Paginator(data,10)
page=request.GET.get('p')
//异常处理,假设用户在url上输入了不是数字的页码,返回第一页,如果输入的页码大于最大页码返回最后一页
try:
contants=paginator.page(page)
except PageNotAnInteger:
contants=paginator.page(1)
except EmptyPage:
contants=paginator.page(paginator.num_pages)
return render(request,'divid_page1.html',locals())
- paginator对象的属性和方法
count 对象数量
num_pages 总页数
page_range 所有页数范围的生成器*
.page()方法,传入当前页码,返回页面
- page对象的属性
object_list 当前页的对象列表
has_next() 有无下一页
has_ previous() 有无上一页
has_other_pages() 有无其他页
next_page_number() 下一页页码
previous_page_number() 上一页页码
start_index()返回当前页第一个对象的在所有对象中的索引,注意,从1开始
end_index()返回当前页最后一个对象在所有对象中的索引,注意,从1开始
paginator 所关联的Paginator对象
分页代码只需写一次存放起来,每次使用时进行{% include ‘xxx.html’%}
调用,防止代码重复冗余
—Django内置分页扩展
在内置分页中拓展自己的功能,可以自己写方法,然后进行继承paginator,page类,来进行自定制。
在我们自己定义的类中需要的一些参数:
- 所有数据
- 当前页
- 每页显示个数 —>show_page
- 最多显示个数
在views中定制新的类
class Mypaginator(Paginator):
def __init__(self,current_page,show_page,*args,**kwargs):
# 当前页
self.current_page=int(current_page)
#默认页数
self.show_page=int(show_page)
super(Mypaginator, self).__init__(*args,**kwargs)
def page_number(self):
if self.num_pages <= self.show_page:
return range(1,self.num_pages+1)
//show_page可以决定每次出现的页码个数
part=self.show_page//2
if self.current_page <= part:
return range(1, self.show_page+1)
if self.current_page+part > self.num_pages:
return range(self.num_pages-self.show_page,self.num_pages+1)
else:
return range(self.current_page-part,self.current_page+part+1)
接着在html文件中进行模板渲染,将页码获取。
—自定义分页
在自定义的分页组件上,不能依托于django给我们的功能,要脱离django的框架,让我们的组件在任何框架上都可以使用。
原理相似,我们用python的类来自定制我们自己的分页,
我们的自定制分页需要传入一些参数,由于不能用django的内置解析,我们不能把数据一次性都读取到内存中,所以我们只需要数据的总数量就好。
我们需要传入的参数:
- 数据总条数
- 当前页数
- 每页展示数据个数
- 每页显示页码总数
- 要传入网页的参数
class Mypaginator:
def __init__(self,totaldata,current_page,position_url,per_page_data=10,show_page=10):
#录入的数据总数
self.totaldata=int(totaldata)
#当前页码
try:
self.current_page=int(current_page)
except:
self.current_page=1
#每页展示的数据个数
self.per_page_data=per_page_data
#每页展示的页码个数
self.show_page=show_page
#目标地址
self.url=position_url
#一下2个方法针对对数据进行切片时,获得开始和结束的数值
def start(self):
return (self.current_page-1)*self.per_page_data
def end(self):
return self.current_page*self.per_page_data
@property
def num_pages(self):
if self.totaldata%self.per_page_data == 0:
return self.totaldata//self.per_page_data
else:
return self.totaldata//self.per_page_data+1
def num_range(self):
if self.num_pages <= self.show_page:
return range(1,self.num_pages+1)
part=self.show_page//2
if self.current_page <= part:
return range(1, self.show_page+1)
if self.current_page+part > self.num_pages:
return range(self.num_pages-self.show_page,self.num_pages+1)
else:
return range(self.current_page-part,self.current_page+part+1)
def bottom_page_num(self):
//此方法中加入了bootstrap中的样式,调用时要在html页面中引入
bottom_page_num=[]
if self.current_page == 1:
previous_page = '<ul class="pagination"><li><a href="{}?p={}">上一页</a></li>'.format(self.url,1)
else:
previous_page='<ul class="pagination"><li><a href="{}?p={}">上一页</a></li>'.format(self.url,self.current_page-1)
bottom_page_num.append(previous_page)
for i in self.num_range():
if i == self.current_page:
element = '<li class="active"><a href="{}?p={}">{}</a></li>'.format(self.url, i, i)
else:
element='<li><a href="{}?p={}">{}</a></li>'.format(self.url,i,i)
bottom_page_num.append(element)
if self.current_page == self.num_pages:
next_page = '<li><a href="{}?p={}">下一页</a></li></ul>'.format(self.url,self.num_pages)
else:
next_page='<li><a href="{}?p={}">下一页</a></li></ul>'.format(self.url,self.current_page+1)
bottom_page_num.append(next_page)
#返回字符串否则会在网页上出现['','','']的形式
return ''.join(bottom_page_num)
这样我们在其他地方使用时只需要调用这个类就可以实现我们自定制的分页显示了