Пагинатор

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__(). Для последовательной разбивки на страницы QuerySets следует упорядочить, например, с order_by()предложением или по умолчанию orderingдля модели.

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

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

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

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

Paginator.page( число )

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

Paginator.get_elided_page_range( число , * , on_each_side = 3 , on_ends = 2 )
Новое в Django 3.2.

Возвращает список номеров страниц, отсчитываемый от 1, аналогичный Paginator.page_range, но может добавлять многоточие к одной или обеим сторонам текущего номера страницы, если Paginator.num_pagesон большой.

Количество страниц, которые нужно включить с каждой стороны номера текущей страницы, определяется on_each_sideаргументом, который по умолчанию равен 3.

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

Например, со значениями по умолчанию для on_each_sideи on_ends, если текущая страница - 10 и есть 50 страниц, диапазон страниц будет . В результате появятся страницы 7, 8 и 9 слева и 11, 12 и 13 справа от текущей страницы, а также страницы 1 и 2 в начале и 49 и 50 в конце.[1, 2, '…', 7, 8, 9, 10, 11, 12, 13, '…', 49, 50]

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

Атрибуты

Paginator.ELLIPSIS
Новое в Django 3.2.

Переводимая строка, используемая в качестве замены пропущенных номеров страниц в диапазоне страниц, возвращаемом get_elided_page_range(). По умолчанию '…'.

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