Паджинатор
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). Вызывает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.
Атрибуты
-
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.1/ref/paginator/