Постраничная разбивка
Django предоставляет несколько классов, которые помогают управлять данными с разбивкой на страницы, то есть данными, разделёнными на несколько страниц со ссылками «Предыдущая/Следующая». Эти классы находятся в django/core/paginator.py.
Примеры см. в тематическом руководстве по разбиению на страницы.
Paginator класс
-
class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True, error_messages=None)[источник] -
При использовании
len()или прямом переборе объект paginator ведёт себя как последовательность объектовPage.
-
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равно нулю, то есть страницы никогда не объединяются, и на последней странице может остаться один элемент. Значениеorphansдолжно быть меньше значенияper_page.Устарело с версии 6.0: Поддержка значения аргумента
orphans, большего или равного значению аргументаper_page, объявлена устаревшей.
-
Paginator.allow_empty_first_page -
Необязательный аргумент. Определяет, может ли первая страница быть пустой. Если
False, аobject_listпуст, будет вызвана ошибкаEmptyPage.
-
Paginator.error_messages -
Аргумент
error_messagesпозволяет переопределить сообщения об ошибках, которые вызывает paginator по умолчанию. Передайте словарь с ключами, соответствующими сообщениям об ошибках, которые нужно переопределить. Доступны следующие ключи сообщений об ошибках:invalid_page,min_pageиno_results.Например, сообщение об ошибке по умолчанию выглядит так:
>>> from django.core.paginator import Paginator >>> paginator = Paginator([1, 2, 3], 2) >>> paginator.page(5) Traceback (most recent call last): ... EmptyPage: That page contains no results
А пользовательское сообщение об ошибке выглядит так:
>>> paginator = Paginator( ... [1, 2, 3], ... 2, ... error_messages={"no_results": "Page does not exist"}, ... ) >>> paginator.page(5) Traceback (most recent call last): ... EmptyPage: Page does not exist
Методы
-
Paginator.get_page(number)[источник] -
Возвращает объект
Pageс указанным индексом (начиная с 1), а также обрабатывает выходящие за границы диапазона и недопустимые номера страниц.Если номер страницы не является числом, возвращается первая страница. Если номер страницы отрицательный или больше числа страниц, возвращается последняя страница.
Исключение
EmptyPageвызывается только в том случае, если вы укажетеPaginator(..., allow_empty_first_page=False), аobject_listпуст.
-
Paginator.page(number)[источник] -
Возвращает объект
Pageс указанным индексом (начиная с 1). Вызывает исключениеPageNotAnInteger, еслиnumberнельзя преобразовать в целое число с помощью вызоваint(). Вызывает исключениеEmptyPage, если указанного номера страницы не существует.
-
Paginator.get_elided_page_range(number, *, on_each_side=3, on_ends=2)[источник] -
Возвращает нумерованный с 1 список номеров страниц, подобный
Paginator.page_range, но при большом значенииPaginator.num_pagesперед текущим номером страницы и/или после него может добавляться многоточие.Количество страниц, включаемых с каждой стороны от текущего номера страницы, задаётся аргументом
on_each_side, значение которого по умолчанию равно 3.Количество страниц, включаемых в начало и конец диапазона страниц, задаётся аргументом
on_ends, значение которого по умолчанию равно 2.Например, если использовать значения
on_each_sideиon_endsпо умолчанию, текущая страница — 10, а всего страниц — 50, диапазон страниц будет таким:[1, 2, '…', 7, 8, 9, 10, 11, 12, 13, '…', 49, 50]. Таким образом, слева от текущей страницы будут страницы 7, 8 и 9, справа — 11, 12 и 13, а в начале и конце диапазона — страницы 1 и 2, а также 49 и 50.Вызывает исключение
InvalidPage, если указанного номера страницы не существует.
Атрибуты
-
Paginator.ELLIPSIS -
Переводимая строка, используемая вместо пропущенных номеров страниц в диапазоне, возвращаемом методом
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].
AsyncPaginator класс
-
class AsyncPaginator(object_list, per_page, orphans=0, allow_empty_first_page=True, error_messages=None)[источник] -
Асинхронная версия
Paginator.AsyncPaginatorимеет те же атрибуты и сигнатуры, что иPaginator, за следующими исключениями:- Атрибут
Paginator.countподдерживается как асинхронный методAsyncPaginator.acount(). - Атрибут
Paginator.num_pagesподдерживается как асинхронный методAsyncPaginator.anum_pages(). - Атрибут
Paginator.page_rangeподдерживается как асинхронный методAsyncPaginator.apage_range().
Для
AsyncPaginatorдоступны асинхронные версии тех же методов, что и дляPaginator; их имена имеют префиксa. Например, используйтеawait async_paginator.aget_page(number)вместоpaginator.get_page(number). - Атрибут
Page класс
Обычно объекты Page не создают вручную — их получают при переборе Paginator или с помощью Paginator.page().
-
class Page(object_list, number, paginator)[источник] -
При использовании
len()или прямом переборе объект страницы ведёт себя как последовательность объектовPage.object_list.
Методы
-
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) относительно всех объектов в списке paginator. Например, при разбиении списка из 5 объектов по 2 объекта на страницу вызов
start_index()для второй страницы вернёт3.
-
Page.end_index()[источник] -
Возвращает индекс последнего объекта на странице (начиная с 1) относительно всех объектов в списке paginator. Например, при разбиении списка из 5 объектов по 2 объекта на страницу вызов
end_index()для второй страницы вернёт4.
Атрибуты
-
Page.object_list -
Список объектов на этой странице.
-
Page.number -
Номер этой страницы, начиная с 1.
-
Page.paginator -
Связанный объект
Paginator.
AsyncPage класс
-
class AsyncPage(object_list, number, paginator)[источник] -
Асинхронная версия
Page.AsyncPageимеет те же атрибуты и сигнатуры, что иPage, а также асинхронные версии всех тех же методов с префиксомa. Например, используйтеawait async_page.ahas_next()вместоpage.has_next().У
AsyncPageесть следующий дополнительный метод:-
aget_object_list() -
Возвращает
AsyncPage.object_listв виде списка. Прежде чемAsyncPageможно будет использовать как последовательностьAsyncPage.object_list, необходимо дождаться выполнения этого метода.
-
Исключения
-
exception InvalidPage[источник] -
Базовый класс исключений, вызываемых, если paginator передан недопустимый номер страницы.
Метод Paginator.page() вызывает исключение, если запрошенная страница недопустима (то есть номер не является целым числом) или не содержит объектов. Как правило, достаточно перехватить исключение InvalidPage, но для более точной обработки можно перехватывать каждое из следующих исключений:
-
exception PageNotAnInteger[источник] -
Вызывается, если методу
page()передано значение, не являющееся целым числом.
-
exception EmptyPage[источник] -
Вызывается, если методу
page()передано допустимое значение, но на этой странице нет объектов.
Оба исключения являются подклассами InvalidPage, поэтому их можно обрабатывать с помощью except InvalidPage.
© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/6.0/ref/paginator/