Django rest框架:自定义分页下一个/上一个链接

Posted

技术标签:

【中文标题】Django rest框架:自定义分页下一个/上一个链接【英文标题】:Django rest framework: custom pagination next/previous links 【发布时间】:2020-04-23 01:35:52 【问题描述】:

在后端作为DEFAULT_PAGINATION_CLASS,我使用的是内置的PageNumberPagination。 由于我使用vue.jsfetch 的原因,我不需要像django-rest-framework 提供的那样传递整个网址:

"count": 5,
"next": "http://127.0.0.1:8000/api/something/?page=2",
"previous": null

但只有基本网址之后的部分,例如:

/api/something/?page=2

或者只是页码,所以我可以建立自己的端点,例如:

if (!pageNumber) 
  let endpoint = "/api/something/"
 else 
  let endpoint = "/api/something/" + "?page=" + pageNumber;

使用django 和像vue 这样的javascript 框架使用bootstraps pagination component 进行分页的正确方法是什么?

【问题讨论】:

你的解决方案是什么? 您需要 current_page 和 total_pages。然后在你的前端你的当前页面是current_page,后退按钮是current_page-1,下一个按钮是current_page+1,页面项目的数量是total_pages 【参考方案1】:

在视图中覆盖您的分页响应,更改您想要的任何内容。

 def get_paginated_response(self, data):
        return Response(
            'links': 
                'next': self.get_next_link(),
                'previous': self.get_previous_link()
            ,
            'current_page': int(self.request.query_params.get('page', 1)),
            'total': self.page.paginator.count,
            'per_page': self.page_size,
            'total_pages': round(self.page.paginator.count/self.page_size, 1),
            'data': data,
        )

【讨论】:

【参考方案2】:
#it is your pagination.py
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response

class MyFavoritePagination(PageNumberPagination):
    def get_paginated_response(self, data):
        nl = self.get_next_link()
        pl = self.get_previous_link()
        return Response(
            'links': 
                'next': nl[nl.find("/api") : ] if nl is not None else None,
                'previous': pl[pl.find("/api") : ] if pl is not None else None
            ,
            'count': self.page.paginator.count,
            'results': data
        )

【讨论】:

虽然此代码 sn-p 可能是解决方案,但 including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 谢谢,我是新手)【参考方案3】:

我们可以继承PageNumberPagination 并覆盖get_next_link()get_previous_link() 方法以在request 对象中添加与一个不同的域:

url = self.request.build_absolute_uri('https://front-end-domain.com')`

来自build_absolute_uri()docs

【讨论】:

以上是关于Django rest框架:自定义分页下一个/上一个链接的主要内容,如果未能解决你的问题,请参考以下文章

django-rest-framework框架总结之认证权限限流过滤分页及异常处理

django-rest-framework框架总结之认证权限限流过滤分页及异常处理

Django Rest 框架 - APIView 分页

django 分页与美化

Python - Django - 添加首页尾页上一页下一页

织梦栏目列表页分页条获取上一页下一页链接