分页器-1-原生django View-[前端分离,拿到列表形式数据]-自定义分页器

一、原生使用

导入:

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})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值