Пагинация

Django предлагает несколько классов для обработки данных, разбитых на страницы, то есть данных, разделенных на несколько страниц с помощью ссылок «Предыдущий / Следующий». Эти классы можно найти в django / core / paginator.py .

Класс Paginator

классPaginator ( object_list , per_page , сироты = 0 , allow_empty_first_page = True )

Пагинатор действует как последовательность Page при len() непосредственном использовании или повторении.

Изменено в Django 3.1:

Paginator Добавлена поддержка перебора .

Paginator.object_list

Обязательное. Список, кортеж QuerySet или другой сегментируемый объект с помощью метода count() или __len__() . Для последовательной разбивки на страницы QuerySet необходимо отсортировать, например. с предложением order_by() или с сортировкой ordering по умолчанию для модели.

Проблемы с производительностью при QuerySet большой разбивке на страницы

Если вы используете один QuerySet с очень большим количеством элементов, получение большого количества страниц может быть медленным с некоторыми базами данных, потому что LIMIT / OFFSET результирующий запрос должен подсчитывать количество записей OFFSET , что занимает больше времени. с большим количеством страниц.

Paginator.per_page

Обязательное. Максимальное количество элементов для включения на страницу без учета сирот (см. Необязательный параметр orphans ниже).

Paginator.orphans

По желанию. Используйте этот параметр, если вам не нужна последняя страница с очень небольшим количеством элементов. Когда последняя страница содержит только количество orphans элементов или меньше, то эти элементы добавляются на предыдущую страницу (которая становится последней страницей) вместо того, чтобы оставлять их одни на странице. Например, с 23 элементами per_page=10 и orphans=3 будет две страницы; первый с 10 элементами и второй (и последний) с 13 элементами. orphans по умолчанию равен нулю, что означает, что страницы никогда не соединяются и последняя страница может содержать только один элемент.

Paginator.allow_empty_first_page

По желанию. Указывает, может ли первая страница быть пустой. Со значением False и object_list пустым списком будет выдана ошибка EmptyPage .

Методы

Paginator.get_page( число )

Возвращает объект, Page соответствующий индексу number (начиная с 1), также обрабатывая недопустимые или выходящие за пределы диапазона номера страниц.

Если страница не является номером, возвращается первая страница. Если номер страницы отрицательный или больше количества страниц, возвращается последняя страница.

Выдает исключение только в том EmptyPage случае, если вы указываете, и это пусто.Paginator(..., allow_empty_first_page=False) object_list

Paginator.page( число )

Возвращает объект, Page соответствующий индексу number (начиная с 1). Если указанный номер страницы не существует, создается исключение InvalidPage .

Атрибуты

Paginator.count

Общее количество объектов на всех страницах.

Заметка

При определении количества объектов , содержащихся в object_list , Paginator первой попытке вызова object_list.count() . Если object_list нет метода count() , Paginator возвращается len(object_list) . Это позволяет таким объектам, как они, QuerySet использовать count() более эффективный метод там, где это необходимо.

Paginator.num_pages

Общее количество страниц.

Paginator.page_range

Интервальная итерация номеров страниц, начиная с 1, например производство .[1, 2, 3, 4]

Класс Page

Обычно вы не Page создаете объекты вручную - вы получите их путем повторения Paginator или использования Paginator.page() .

классPage ( список_объектов , число , пагинатор )

Страница ведет себя как список, Page.object_list когда вы применяете len() или повторяете ее.

Методы

Page.has_next()

Возвращает, True если есть следующая страница.

Page.has_previous()

Возвращает, True если есть предыдущая страница.

Page.has_other_pages()

Возвращает True , есть ли следующая страница или предыдущая.

Page.next_page_number()

Возвращает номер следующей страницы. Генерировать, InvalidPage если нет следующей страницы.

Page.previous_page_number()

Возвращает номер предыдущей страницы. Генерируется, InvalidPage если предыдущей страницы нет.

Page.start_index()

Возвращает индекс (начиная с 1) первого объекта на странице относительно всех других объектов в списке пейджера. Например, при разбиении на страницы списка из 5 объектов в группах по 2, start_index() метод второй страницы вернется 3 .

Page.end_index()

Возвращает индекс (начиная с 1) последнего объекта на странице относительно всех других объектов в списке пагинатора. Например, при разбиении на страницы списка из 5 объектов в группах по 2, end_index() метод второй страницы вернется 4 .

Атрибуты

Page.object_list

Список объектов на этой странице.

Page.number

Номер страницы (начиная с 1) этой страницы.

Page.paginator

Paginator Связанный объект .

Исключения

исключение InvalidPage

Базовый класс для исключений, возникающих, когда пейджер получает недопустимый номер страницы.

Метод Paginator.page() выдает исключение, когда запрошенная страница недействительна (например, не целое число) или когда она не содержит объекта. Обычно достаточно поймать исключение InvalidPage , но если вам нужно больше тонкости, вы можете поймать одно из следующих исключений:

исключение PageNotAnInteger

Генерируется, когда page() получает значение, не являющееся целым числом.

исключение EmptyPage

Генерируется, когда page() получает допустимое значение, но рассматриваемая страница не содержит объекта.

Эти два исключения являются подклассами InvalidPage , поэтому их можно поймать с помощью строки .except InvalidPage

Copyright ©2021 All rights reserved