Конфигурация диапазона содержимого для Django Rest Pagination

6.30.15 - КАК Я МОГУ СДЕЛАТЬ ЭТОТ ВОПРОС ЛУЧШЕ И БОЛЬШЕ ПОМОЧЬ ДРУГИМ? ОБРАТНАЯ СВЯЗЬ БУДЕТ ПОЛЕЗНОЙ. СПАСИБО!

Мне нужно отправить заголовок диапазона содержимого в запрос dojo/dgrid:

Я не могу найти никаких примеров, КАК это сделать. Я не совсем уверен, куда идет этот параметр (Content-Range: элементы 0-9/*). Мне был дан отличный пример разбивки на страницы заголовка ссылки: Dgango Rest Framework Pagination Settings - Content-Range Но я не знаю, как заставить это работать, чтобы получить ответ Content-Range. Любые берущие или кто-нибудь знает какие-либо хорошие ресурсы или примеры?

ОБНОВЛЕНИЕ: я пытаюсь создать нумерацию страниц в Dojo / grid. Я использую API-интерфейс на стороне сервера (Django Rest Framework) для подачи данных в Dojo / Dgrid. Django Rest Framework не отправляет автоматически заголовки диапазона содержимого при получении ответа от Dojo. Dojo отправляет запрос диапазона при форматировании, чтобы иметь нумерацию страниц. Сейчас я не знаю, как настроить API Django Rest Framework для отправки заголовка диапазона содержимого при получении запроса от Dojo. К сожалению, я пытаюсь сделать что-то очень конкретное, и просто общие настройки с обеих сторон не работают.

2 ответа

Решение

Если вы говорите о предоставлении 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, так что вы можете взять или оставить их, в зависимости от того, используете ли вы их в другом месте.)

В том числе 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 товаров возвращены из общего количества. 50,

Примечание: вы также можете использовать * вместо total_items если подсчет итогов стоит дорого.

Content-Range: items 0-9/* # Use this if total is expensive to calculate
Другие вопросы по тегам