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