Пагинатор
Django предоставляет несколько классов, которые помогают управлять данными, разбитыми на несколько страниц, с ссылками «Предыдущая/Следующая». Эти классы находятся в django/core/paginator.py.
Примеры см. в руководстве по пагинации.
Paginator класс
-
class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True, error_messages=None) -
Пагинатор ведет себя как последовательность
Pageпри использованииlen()или при прямом итерировании.
-
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.error_messages -
Добавлено в Django 5.0.
Аргумент
error_messagesпозволяет переопределить стандартные сообщения, которые будет выводить пагинатор. Передайте словарь с ключами, соответствующими сообщениям об ошибках, которые вы хотите переопределить. Доступные ключи сообщений об ошибках: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) -
Возвращает список номеров страниц, аналогичный
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].
Page класс
Обычно вы не создаёте объекты Page вручную — вы получаете их, итерируя Paginator, или используя Paginator.page().
-
class Page(object_list, number, paginator) -
Страница ведет себя как последовательность
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.
Исключения
-
exception InvalidPage -
Базовый класс исключений, выбрасываемых, когда пагинатору передаётся некорректный номер страницы.
Метод 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/5.0/ref/paginator/