Пагинация ¶
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
.
Исключения ¶
-
исключение
InvalidPage
¶ Базовый класс для исключений, возникающих, когда пейджер получает недопустимый номер страницы.
Метод Paginator.page()
выдает исключение, когда запрошенная страница недействительна (например, не целое число) или когда она не содержит объекта. Обычно достаточно поймать исключение InvalidPage
, но если вам нужно больше тонкости, вы можете поймать одно из следующих исключений:
-
исключение
PageNotAnInteger
¶ Генерируется, когда
page()
получает значение, не являющееся целым числом.
-
исключение
EmptyPage
¶ Генерируется, когда
page()
получает допустимое значение, но рассматриваемая страница не содержит объекта.
Эти два исключения являются подклассами InvalidPage
, поэтому их можно поймать с помощью строки .except InvalidPage