Разделитель страниц
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/