Paginator¶
Django предоставляет несколько классов, которые помогают вам управлять постраничными данными - то есть данными, разделенными на несколько страниц, со ссылками «Предыдущая/Следующая». Эти классы находятся в разделе django/core/paginator.py.
Paginator класс¶
-
class
Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)[исходный код]¶ Пагинатор действует как последовательность
Pageпри использованииlen()или прямой итерации.Changed in Django 3.1:Добавлена поддержка итерации по
Paginator.
-
Paginator.object_list¶ Требуется. Список, кортеж,
QuerySetили другой разрезаемый объект с методомcount()или__len__(). Для последовательной пагинацииQuerySetдолжны быть упорядочены, например, с помощьюorder_by()оговорки или по умолчаниюorderingв модели.Проблемы с производительностью при пагинации больших
QuerySetsЕсли вы используете
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. Вызывает сообщениеInvalidPage, если заданный номер страницы не существует.
Атрибуты¶
-
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.
Исключения¶
-
exception
InvalidPage[исходный код]¶ Базовый класс для исключений, возникающих, когда пагинатору передается недопустимый номер страницы.
Метод Paginator.page() вызывает исключение, если запрашиваемая страница недействительна (т.е. не является целым числом) или не содержит объектов. Обычно достаточно перехватить исключение InvalidPage, но если вы хотите большей детализации, вы можете перехватить одно из следующих исключений:
-
exception
PageNotAnInteger[исходный код]¶ Возникает, когда
page()получает значение, не являющееся целым числом.
-
exception
EmptyPage[исходный код]¶ Возникает, когда
page()имеет допустимое значение, но на этой странице не существует объектов.
Оба исключения являются подклассами InvalidPage, поэтому вы можете обработать их оба с помощью except InvalidPage.