【问题标题】:In Django Rest Framework, how can I view paginated data with TemplateHTMLRenderer?在 Django Rest Framework 中,如何使用 TemplateHTMLRenderer 查看分页数据?
【发布时间】:2017-03-17 20:38:06
【问题描述】:

我正在使用 Django Rest Framework,我正在尝试使用 doc example 从 API 视图转换为 TemplateHTMLResponse。我能够完成大部分工作并加载模板并传递所有数据,但是该过程的 HTML 方面的文档很少。

我遇到的问题是结果没有分页。我能够访问和迭代所有数据,但我需要分页来组织。

views.py.

class BoxViewSet(viewsets.ModelViewSet):

    queryset = Uploadobject.objects.all().exclude(verified=False)
    serializer_class = BoxSerializer
    permission_classes = (permissions.IsAuthenticatedOrReadOnly,
                            IsBox)

    #renderer_classes = (renderers.TemplateHTMLRenderer)
    def list(self, request):
        queryset = Uploadobject.objects.all().exclude(verified=False)


        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, data=request.data)

            if serializer.is_valid():

                serdata = self.get_paginated_response(serializer.data)
                data= {'objects': queryset,
                    'serializers': serializer}
                return Response(data, template_name='restframework/objectlist.html')

objectlist.html

{% if serializers %}  
{{ serializers }}
{% endif %}

  {% if objects %}
    {% for object in objects %}
        <ul>
            <li>{{ object.Title }}</li>
            <li>{{ object.Category }}</li>
        </ul>
    {% endfor %}

    {% else %}
        <p>No objects.</p>
    {% endif %}

我已经尝试了很多东西,包括 ListModelMixin 并按照pagination docs 的建议创建自定义分页脚本,但似乎没有任何通过。我读到有从 Django 分页的方法,但我认为将所有分页保留在 Django Rest Framework 中会更简单。据我所知,我有正确的后端数据,只需要更正 HTML。综上所述,在模板页面上以分页设置显示所有模型数据的最简单方法是什么?

【问题讨论】:

    标签: python django python-3.x pagination django-rest-framework


    【解决方案1】:

    这是因为即使您使用 DRF 方法对查询集进行了分页,您仍然使用原始查询集发送响应。

    这样的事情应该可以工作:

    renderer_classes = (renderers.TemplateHTMLRenderer, )
    
    def list(self, request):
        queryset = Uploadobject.objects.all().exclude(verified=False)
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, data=request.data)
            return self.get_paginated_response(serializer.data)
        data= {'objects': queryset, 'serializers': serializer}
        return Response(data, template_name='restframework/objectlist.html')
    

    【讨论】:

    • 这是文档中提到的方式,对我不起作用。首先,如果serializer.is_valid():,我得到了我需要添加的错误,添加起来很简单。我收到Returned a template response with no 'template_name' attribute set on either the view or response 的错误。这不会返回 Response 对象,因此我也无法传递 HTML 参数。我可以从 HTML 页面访问分页返回吗?
    • @RknRobin 您找到问题的答案了吗?
    • @Patrick 不。我已经放弃了我崇高的 Django 梦想。
    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 2020-10-28
    • 1970-01-01
    • 2020-08-19
    • 2016-07-03
    • 2015-05-18
    • 2015-10-22
    相关资源
    最近更新 更多