Пагинатор¶
Django предоставляет несколько классов, которые помогут вам управлять данными, разбитыми на страницы, то есть данными, разделенными на несколько страниц со ссылками «Предыдущий/Следующий». Эти классы находятся в django/core/paginator.py.
Класс Пагинатор¶
- class Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)¶
Пагинатор действует как последовательность
Pageпри использованииlen()или его прямой итерации.Changed in Django 3.1:Support for iterating over
Paginatorwas added.
- Paginator.object_list¶
Необходимый. Список, кортеж, QuerySet или другой срезаемый объект с помощью метода count() или __len__(). Для последовательной нумерации страниц следует упорядочить
QuerySet, например: с предложениемorder_by()или со значением по умолчаниюorderingдля модели.Проблемы с производительностью при разбиении на страницы больших
QuerySetов.Если вы используете
QuerySetс очень большим количеством элементов, запрос больших номеров страниц может быть медленным в некоторых базах данных, поскольку результирующий запросLIMIT/OFFSETдолжен подсчитывать количество записейOFFSET, что занимает больше времени по мере увеличения номера страницы.
- Paginator.per_page¶
Необходимый. Максимальное количество элементов, которые можно включить на страницу, не включая потерянные элементы (см. необязательный аргумент
orphansниже).
- Paginator.orphans¶
Необязательный. Используйте это, если вы не хотите, чтобы на последней странице было очень мало элементов. Если на последней странице обычно количество элементов меньше или равно «сиротам», то эти элементы будут добавлены на предыдущую страницу (которая станет последней страницей), а не оставлять элементы на странице сами по себе. Например, при 23 элементах per_page=10 и orphans=3 будет две страницы; первая страница с 10 элементами и вторая (и последняя) страница с 13 элементами. По умолчанию «сироты» равны нулю, что означает, что страницы никогда не объединяются, и последняя страница может содержать один элемент.
- 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)¶
Returns a
Pageobject with the given 1-based index. RaisesInvalidPageif the given page number doesn’t exist.
Атрибуты¶
- 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 вручную — вы получите их путем итерации 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.
Исключения¶
- exception InvalidPage¶
Базовый класс для исключений, возникающих, когда средству разбиения на страницы передается недопустимый номер страницы.
Метод Paginator.page() вызывает исключение, если запрошенная страница недействительна (т. е. не является целым числом) или не содержит объектов. Как правило, достаточно перехватить исключение InvalidPage, но если вам нужна большая детализация, вы можете перехватить любое из следующих исключений:
- exception PageNotAnInteger¶
Возникает, когда
page()присваивается значение, не являющееся целым числом.
- exception EmptyPage¶
Возникает, когда
page()присвоено допустимое значение, но на этой странице не существует объектов.
Оба исключения являются подклассами InvalidPage, поэтому вы можете обрабатывать их оба с помощью кроме InvalidPage.