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