Django对页面限制的分页显示仍然是最后的结果无休止

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django对页面限制的分页显示仍然是最后的结果无休止相关的知识,希望对你有一定的参考价值。

我有一个基于Django函数的API,它输入页码,每页都有页面大小。这是我的代码。

@api_view(['POST'])
def attendance_all_get_list_by_page(request):
    # ----- YAML below for Swagger -----
    """
    description: attendance_all_get_list_by_page
    parameters:
      - name: page
        type: integer
        required: true
        location: form   
      - name: page_limit
        type: integer
        required: true
        location: form                   
    """
    attendance_list = Attendance.objects.all().order_by('id') 

    page = request.GET.get('page', request.POST['page'])
    paginator = Paginator(attendance_list, request.POST['page_limit'])

    try:
        attendances = paginator.page(page)
    except PageNotAnInteger:
        attendances = paginator.page(request.POST['page'])
    except EmptyPage:
        attendances = paginator.page(paginator.num_pages)


    serializer = AttendanceSerializer(list(attendances), many=True)
    data = serializer.data[:]
    return Response(data, status=status.HTTP_200_OK)  

我的序列化器:

class EmployeeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Employee
        fields = ("id", "username")

class AttendanceSerializer(serializers.ModelSerializer):
    employee = EmployeeSerializer(many=False, read_only=True)

    class Meta:
        model = Attendance
        fields = ('id','employee','created_at')

想象一下,我有出席记录

16,17,18,19

因此,例如使用page = 2 page_limit = 2,它将显示以下内容(这应该是4条记录的最后一页)

[
  {
    "id": 18,
    "employee": {
      "id": 16,
      "username": "haha"
    },
    "created_at": "2017-12-28T03:29:29.698339Z"
  },
  {
    "id": 19,
    "employee": {
      "id": 16,
      "username": "haha"
    },
    "created_at": "2017-12-28T03:38:53.639749Z"
  }
]

如果我这样做(page = 3 page_limit = 2)或(page = 10 page_limit = 2),它仍会显示

[
  {
    "id": 18,
    "employee": {
      "id": 16,
      "username": "haha"
    },
    "created_at": "2017-12-28T03:29:29.698339Z"
  },
  {
    "id": 19,
    "employee": {
      "id": 16,
      "username": "haha"
    },
    "created_at": "2017-12-28T03:38:53.639749Z"
  }
]

预期的结果应该是

[]

我的分页错了,最后一页有什么影响。我希望最后一页显示最后一页的结果,但之后应该是空记录列表。

答案

您捕获EmptyPage并返回最后一页内容。因此,如果您超出范围,您将每次都获得第二页。在这种情况下,您需要返回空列表:

except EmptyPage:
    attendances = []

以上是关于Django对页面限制的分页显示仍然是最后的结果无休止的主要内容,如果未能解决你的问题,请参考以下文章

使用封装的分页组件或element-ui分页组件删除当前页最后一条数据没有跳转到上一页显示暂无数据的bug

使用封装的分页组件或element-ui分页组件删除当前页最后一条数据没有跳转到上一页显示暂无数据的bug

django的分页--不全也未实现

ASP.NET 中的分页;过滤后页数不变

采用AJAX + history api做无刷新页面的分页

用java写的分页,数据有12条,每页显示2条,结果页面只有两页的内容。