Разделитель страниц
Django предоставляет несколько классов, которые помогают управлять данными, разбитыми на несколько страниц, с ссылками «Предыдущая/Следующая». Эти классы находятся в django/core/paginator.py.
Примеры см. в руководстве по разбиению на страницы.
Paginator класс
-
class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True) -
Разделитель страниц работает как последовательность
Pageпри использованииlen()или непосредственном итерировании.Изменено в Django 3.1:Добавлена поддержка итерирования по
Paginator.
-
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.get_page(number) -
Возвращает объект
Pageс заданным индексом (от 1), обрабатывая при этом ошибки выхода за пределы диапазона и недопустимые номера страниц.Если страница не число, возвращает первую страницу. Если номер страницы отрицательный или больше, чем количество страниц, возвращает последнюю страницу.
Возникает исключение
EmptyPageтолько если вы укажетеPaginator(..., allow_empty_first_page=False)иobject_listпусто.
-
Paginator.page(number) -
Возвращает объект
Pageс заданным индексом (от 1). ВызываетPageNotAnInteger, еслиnumberнельзя преобразовать в целое число, вызвавint(). ВызываетInvalidPage, если указанной страницы не существует.
-
Paginator.get_elided_page_range(number, *, 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, диапазон страниц будет[1, 2, '…', 7, 8, 9, 10, 11, 12, 13, '…', 49, 50]. Это приведет к отображению страниц 7, 8 и 9 слева и 11, 12 и 13 справа от текущей страницы, а также страниц 1 и 2 в начале и 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().
-
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/3.2/ref/paginator/