Разделитель страниц
Django предоставляет несколько классов, которые помогают управлять данными, разделенными на несколько страниц, с ссылками «Предыдущая/Следующая». Эти классы находятся в django/core/paginator.py.
Примеры см. в руководстве по разбиению на страницы.
Paginator класс
-
class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)[source] -
Разделитель страниц ведет себя как последовательность
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.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 -
Общее количество объектов на всех страницах.
Примечание
При определении количества объектов, содержащихся в
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)[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/4.1/ref/paginator/