Spec-Zone.ru › Django 5.2

Разделитель страниц

Django предоставляет несколько классов, которые помогают вам управлять данными, разбитыми на несколько страниц, с ссылками «Предыдущая/Следующая». Эти классы находятся в django/core/paginator.py.

Примеры см. в руководстве по разделению на страницы.

Paginator класс

class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True, error_messages=None) [source]

Разделитель страниц ведет себя как последовательность Page при использовании len() или итерации напрямую.

Paginator.object_list

Обязательно. Список, кортеж, QuerySet или другой объект с возможностью срезов, имеющий метод count() или __len__(). Для согласованной постраничной навигации объекты должны быть упорядочены, например, с помощью условия 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

Аргумент 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) [source]

Возвращает объект Page с заданным индексом (1-основанный), обрабатывая при этом номера страниц за пределами диапазона и недопустимые номера.

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

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

Paginator.page(number) [source]

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

Paginator.get_elided_page_range(number, *, on_each_side=3, on_ends=2) [source]

Возвращает список номеров страниц (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 [source]

Общее количество объектов на всех страницах.

Примечание

При определении количества объектов, содержащихся в object_list, Paginator сначала попытается вызвать object_list.count(). Если у object_list нет метода count(), то Paginator вернется к использованию len(object_list). Это позволяет объектам, таким как QuerySet, использовать более эффективный метод count(), когда он доступен.

Paginator.num_pages [source]

Общее количество страниц.

Paginator.page_range [source]

Итератор диапазона номеров страниц (1-основанный), например, возвращает [1, 2, 3, 4].

Page класс

Обычно вы не создаёте объекты Page вручную — вы получаете их, итерируя Paginator или используя Paginator.page().

class Page(object_list, number, paginator) [source]

Страница ведет себя как последовательность Page.object_list при использовании len() или при непосредственной итерации.

Методы

Page.has_next() [source]

Возвращает True, если существует следующая страница.

Page.has_previous() [source]

Возвращает True, если существует предыдущая страница.

Page.has_other_pages() [source]

Возвращает True, если существует следующая или предыдущая страница.

Page.next_page_number() [source]

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

Page.previous_page_number() [source]

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

Page.start_index() [source]

Возвращает 1-индексированный индекс первого объекта на странице относительно всех объектов в списке пагинатора. Например, при разбиении списка из 5 объектов на страницы по 2 объекта на страницу, для второй страницы start_index() вернёт 3.

Page.end_index() [source]

Возвращает 1-индексированный индекс последнего объекта на странице относительно всех объектов в списке пагинатора. Например, при разбиении списка из 5 объектов на страницы по 2 объекта на страницу, для второй страницы end_index() вернёт 4.

Атрибуты

Page.object_list

Список объектов на этой странице.

Page.number

Номер страницы (с 1) для этой страницы.

Page.paginator

Соответствующий объект Paginator.

Исключения

exception InvalidPage [source]

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

Метод Paginator.page() генерирует исключение, если запрошенная страница недопустима (то есть не является целым числом) или не содержит объектов. Обычно достаточно перехватить исключение InvalidPage, но если вам нужно больше контроля, вы можете перехватить любое из следующих исключений:

exception PageNotAnInteger [source]

Вызывается, когда page() получает значение, которое не является целым числом.

exception EmptyPage [source]

Вызывается, когда page() получает допустимое значение, но на этой странице нет объектов.

Оба исключения являются подклассами InvalidPage, поэтому вы можете обработать оба их с помощью except InvalidPage.

© Django Software Foundation and individual contributors
Licensed under the BSD License.
https://docs.djangoproject.com/en/5.2/ref/paginator/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API