niceyes 发表于 2021-9-29 17:35:59

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

defget(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)                                                 #这里可以加进个总页数的参数吗???????,不知道怎么加进去,



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

阿奇_o 发表于 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>

niceyes 发表于 2021-9-29 21:32:35

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

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

render 我会弄, 上面是 rest framework 框架下实现分页

阿奇_o 发表于 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~


页: [1]
查看完整版本: Django CursorPagination 方法分页,总页数怎么弄进去