鱼C论坛

 找回密码
 立即注册
查看: 2048|回复: 3

Django CursorPagination 方法分页,总页数怎么弄进去

[复制链接]
发表于 2021-9-29 17:35:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def  get(self,request,*args, **kwargs):

        role=models.Role.objects.all()
        page_count=math.ceil(role.count()/4)  #计算总页数,向上取整

        pg=CursorPagination()                          #创建分页对象
        pg.page_size=4                                        #每页4行               
        pg.ordering='-id'                                      #排序 -id倒序

        pager_role=pg.paginate_queryset(queryset=role,request=request,view=self)    #获取分页数据,获取 request 中的 page=""
        ser=PageSerializer(instance=pager_role,many=True)                                     #序列化   
        return pg.get_paginated_response(ser.data)                                                 #这里可以加进个总页数的参数吗???????,不知道怎么加进去,



我现怎么把 总页数返回给前端   

本帖被以下淘专辑推荐:

  • · django|主题: 61, 订阅: 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-9-29 18:43:26 | 显示全部楼层
首先你要明白,"传给前端" 其实是 用什么方法(函数)来传递对象或参数。

具体到Django里,一般是用 render()方法 打通 views.py(后端) 到 html模板(前端)。
def listing(request):
    # 通过模型对象ORM的查询方式获取数据
    # pds = PD.objects.get_queryset().order_by('product_id')  
    
    # Django使用SQL的一种方式
    pds = PD.objects.raw("select * from product_descriptions where product_id <= 1736")
    paginator = Paginator(pds, 10)  # 创建分页对象,每10条数据为一页
    items_cnt = paginator.count     # 总共多少条数据

    page_num = request.GET.get('num', 1)     # 默认取第一页。 url 如 http://127.0.0.1:8000/page?num=2
    page_obj = paginator.get_page(page_num)  

    return render(request, 'listing2.html', {'page_obj': page_obj, 'items_cnt': items_cnt})  
   # render()函数实现views视图("后端控制")和模板("前端显示")之间的对象或参数传递,并实现"渲染/更新网页"
   # 把分页对象,和任何需要传递的参数,用字典传给模板。然后就可以在模板里调用,如 <div>----- 一共 {{items_cnt}} 条记录 ----</div>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-29 21:32:35 | 显示全部楼层
阿奇_o 发表于 2021-9-29 18:43
首先你要明白,"传给前端" 其实是 用什么方法(函数)来传递对象或参数。

具体到Django里,一般是用 ren ...

render 我会弄, 上面是 rest framework 框架下实现分页
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-2 11:53:20 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-10-2 11:56 编辑
niceyes 发表于 2021-9-29 21:32
render 我会弄, 上面是 rest framework 框架下实现分页


rest framework 是什么。。
好吧,你成功勾起了我的好奇心,于是我研究了两三天。。
第一天搞明白了REST是什么鬼,Django的rest framework 又怎么用,这个DRF框架的分页怎么实现……
——原来REST风格下,通常是"前后端分离"的设计,所以就折腾了会怎么把前后端分离(有"跨域问题")。。
——所以,所以,最后 若是 在后端进行分页, 就是下面这样,
# views.py

# ##############
# DRF的分页实现方式(自定义分页操作类)
# 参考:
# https://www.django-rest-framework.org/api-guide/pagination/
# https://www.sankalpjonna.com/learn-django/pagination-made-easy-with-django-rest-framework
# https://sodocumentation.net/django-rest-framework/topic/9950/pagination


class MyPagination(PageNumberPagination):
    """ 自定义的分页操作类 """
    page_size = 10
    page_size_query_param = 'page_size'
    max_page_size = 1000
    page_query_param = 'p'  
    # ordering = '-id'
    # http://localhost:8000/note/all?p=2&page_size=3 
    def get(self, data):
        response = Response(data)
        response['next'] = self.get_next_link()
        response['previous'] = self.get_previous_link()
        response['count'] = self.page.paginator.count
        return response


# 使用上面自定义的分页操作类
@api_view(['GET',])
def use_MyPagination(request):
    # paginator = PageNumberPagination()  #默认的分页操作类(见settings.py)
    my_pg = MyPagination()   # 用 我自定义的分页操作类
    query_set = Snippet.objects.all()
    context = my_pg.paginate_queryset(query_set, request)
    s = SnippetSerializer(context, many=True)
    return my_pg.get_paginated_response(s.data)

这基本是第一天的成果:实现了DRF的后端数据分页,给传递了(返回)带有分页信息和数据的JSON。

可是。。前端到底怎么拿到后端的数据,具体怎么展示出来呢?。。
于是我又研究了一下 jQuery,Ajax,Vue 。。。
最后,最后,用 Vue+axios+boostrap,基本实现数据表格的前端呈现(目前没有用后端分页的方式,而是在前端代码里获取全部数据,由Vue实现为数据表格的分页。)。
关键参考:https://codepen.io/bilalo05/pen/oNgrKXo

注:前端利用后端分页信息再进行分页展示,也是可以的,关键是前端如何获取到后端数据,并处理和更新页面。

OK~


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 15:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表