一、原生使用
导入:
from django.core.paginator import Paginator
使用:
class UserColectView(View):
def get(self,request):
'''
功能:获取当前用户收藏的切片列表
:param request:
:return:
'''
page = request.GET.get('page',1)
#拿到数据集,queryset对象
user = models.UserCollectSlide.objects.all().values('user_id','tslide_id','tslide__slide_file_name','tslide__slide_path')
#实例化分页器对象,传递数据集和每页大小
paginator = Paginator(user,5)
#拿到结果
page_data = paginator.get_page(page)
#拿到结果列表
res = page_data.object_list
print(res,len(res))
return JsonResponse({
'code':200})
1、模型查询以values() 结尾时,
通过list 可以将queryset直接转成列表
lis = list(user)
2、模型查询时,以filter()或all() 结尾时,不能使用list
from django.core import serializers
dept_list = serializers.serialize("python", models.User.objects.all())
二、自定义分页器
继承原生的分页器,修改如下:
from django.core.paginator import Paginator
from django.core import serializers
class PublicPaginator(Paginator):
def __init__(self, object_list, current_page=1,per_page=5, orphans=0,
allow_empty_first_page=True):
super().__init__(object_list,per_page,orphans,allow_empty_first_page)
self.object_list = object_list #数据集
self._check_object_list_is_ordered()
self.per_page = int(per_page) #每页的数据量
self.orphans = int(orphans)
self.allow_empty_first_page = allow_empty_first_page
self.current_page = 1 if current_page==None else int(current_page) #要获取那一页的数据
@property
def result(self):
#根据页数拿到结果集
page_data = self.get_page(self.current_page)
#拿到最终的数据集
res = page_data.object_list
try:
#all 或 filter结尾的查询数据集转成列表
res = serializers.serialize("python", res)
except Exception as e:
#values结尾的查询数据集转成列表
res = list(res)
#当前页是否有下一页,上一页
has_next = 0
has_prev = 0
#有下一页:当前页面大于等于1,当前页*页面大小 < 总数量
if self.current_page>=1 and self.current_page*self.per_page < self.count:
has_next =1
#有上一页:当前页大于1,且总数据量要大于页面大小
if self.current_page>1 and self.count>self.per_page: #有上一页,页数大于1,page_size小于总数据量
has_prev =1
#获取的数据的页数
current_page = self.current_page if self.current_page<=self.num_pages else self.num_pages
dic ={
'data':res, #当前页的数据
'current_page':current_page, #当前页数
'all_counts':self.count, #总数据量
'page_size':self.per_page, #每页数据量
'all_page':self.num_pages, #总页数
'has_next':has_next, #是否有下一页
'has_prev':has_prev #是否有上一页
}
return dic
视图使用:
class UserColectView(View):
def get(self,request):
'''
功能:获取当前用户收藏的切片列表
:param request:
:return:
'''
page = request.GET.get('page',1)
#拿到数据集:all或filter结尾的查询
user_all = models.User.objects.all()
#实例化分页器
pagenitor2 = PublicPaginator(user_all,per_page=5,current_page=page)
#拿到分页结果
all_dic = pagenitor.result
return JsonResponse({
'all':all_dic})
#参数解析
1、user_all, 要进行分页的数据集
2、per_page=5, page_size,每页的大小
3、current_page=page 当前页码,获取的是当前页码的数据
可以只传递:数据集和当前页码
class UserColectView(View):
def get(self,request):
'''
功能:获取当前用户收藏的切片列表
:param request:
:return:
'''
page = request.GET.get('page',1)
#拿到数据集,values结尾的查询
users = models.User.objects.all().values('name','id')
#实例化分页器对象
pagenitor1 = PublicPaginator(users,per_page=5,current_page=page)
#拿到分页结果
values_dic = pagenitor.result
return JsonResponse({
'values':values_dic})