0

6.30.15 - 我怎样才能使这个问题变得更好,对其他人更有帮助?反馈会很有帮助。谢谢!

我需要向 dojo/dgrid 请求发送内容范围标头:在此处输入图像描述

我找不到任何如何做到这一点的例子。我不确定此设置的去向(内容范围:项目 0-9/*)。在这个问题上,我得到了一个很好的链接头分页示例:Django Rest Framework Pagination Settings - Content-Range但我不知道如何使这项工作产生 Content-Range 响应。任何接受者或任何人都知道任何好的资源或例子?

更新:我正在尝试在 Dojo/grid 中创建分页。我正在使用服务器端 api (Django Rest Framework) 向 Dojo/Dgrid 提供数据。Django Rest Framework 在收到来自 Dojo 的响应时不会自动发送内容范围标头。Dojo 在格式化为分页时会发送范围请求。我现在不知道配置 Django Rest Framework API 以在收到来自 Dojo 的请求时发送内容范围标头。不幸的是,我正在尝试做一些非常具体的事情,而任何一方的常规设置都不起作用。

4

2 回答 2

3

在响应中包含Content-Range标题:

您只需要创建一个标题字典,Content-Range其键和值作为返回的项目数以及存在的总项目数。

例如:

class ContentRangeHeaderPagination(pagination.PageNumberPagination):
    """
    A custom Pagination class to include Content-Range header in the
    response.
    """

    def get_paginated_response(self, data):
        """
        Override this method to include Content-Range header in the response.

        For eg.:
        Sample Content-Range header value received in the response for 
        items 11-20 out of total 50:

                Content-Range: items 10-19/50
        """

        total_items = self.page.paginator.count # total no of items in queryset
        item_starting_index = self.page.start_index() - 1 # In a page, indexing starts from 1
        item_ending_index = self.page.end_index() - 1

        content_range = 'items {0}-{1}/{2}'.format(item_starting_index, item_ending_index, total_items)      

        headers = {'Content-Range': content_range} 

        return Response(data, headers=headers)

假设这是收到的标头:

Content-Range: items 0-9/50 

这表示前 10 个项目被退回 total 50

注意:如果计算总计很昂贵,您也可以使用*代替。total_items

Content-Range: items 0-9/* # Use this if total is expensive to calculate
于 2015-06-18T15:57:14.913 回答
1

如果您正在谈论在响应中提供 Content-Range ,我在对另一个 SO 问题的回答中提到(我相信这也可能来自您的团队?)这个标题有一个替代方案:如果您的响应格式是对象(不仅仅是一个项目数组),它可以指定一个total属性来指示项目的总数。

再次在DRF 文档中寻找几分钟,似乎应该可以自定义响应的格式。

根据文档并阅读 LimitOffsetPagination 的源代码(您希望将其用于 dstore,如上一个问题中已经讨论过的那样),如果我不得不大胆猜测,您应该能够执行以下服务器-边:

class CustomPagination(pagination.LimitOffsetPagination):
    def get_paginated_response(self, data):
        return Response(OrderedDict([
            ('total', self.count),
            ('next', self.get_next_link()),
            ('previous', self.get_previous_link()),
            ('items', data)
        ]))

这故意将计数total和数据分配items给以符合预期dstore/Request。(next并且previous就 dstore 而言完全没有必要,因此您可以拿走或留下它们,这取决于您是否在其他地方使用它们。)

于 2015-06-18T00:09:38.463 回答