Paginator¶
Django предоставляет несколько классов, которые помогут вам управлять постраничными данными - то есть данными, разделенными на несколько страниц, со ссылками «Предыдущая/Следующая». Эти классы находятся в django/core/paginator.py.
Примеры см. в Pagination topic guide.
Paginator класс¶
-
class
Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True, error_messages=None)¶ Пагинатор действует как последовательность
Pageпри использованииlen()или прямой итерации.
-
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.error_messages¶ Аргумент
error_messagesпозволяет переопределить сообщения по умолчанию, которые будет выдавать пагинатор. Передайте словарь с ключами, соответствующими сообщениям об ошибках, которые вы хотите переопределить. Доступны следующие ключи сообщений об ошибках:invalid_page,min_pageиno_results.Например, вот сообщение об ошибке по умолчанию:
>>> from django.core.paginator import Paginator >>> paginator = Paginator([1, 2, 3], 2) >>> paginator.page(5) Traceback (most recent call last): ... EmptyPage: That page contains no results
А вот пользовательское сообщение об ошибке:
>>> paginator = Paginator( ... [1, 2, 3], ... 2, ... error_messages={"no_results": "Page does not exist"}, ... ) >>> paginator.page(5) Traceback (most recent call last): ... EmptyPage: Page does not exist
Методы¶
-
Paginator.get_page(number)¶ Возвращает объект
Pageс заданным индексом, основанным на 1, при этом также обрабатывает номера страниц вне диапазона и недопустимые номера страниц.Если страница не имеет номера, возвращается первая страница. Если номер страницы отрицателен или больше числа страниц, возвращается последняя страница.
Вызывает исключение
EmptyPage, только если вы указалиPaginator(..., allow_empty_first_page=False), аobject_listпуст.
-
Paginator.page(number)¶ Возвращает объект
Pageс заданным индексом, основанным на 1. Вызывает сообщениеPageNotAnInteger, еслиnumberне может быть преобразовано в целое число вызовомint(). ВызываетEmptyPage, если заданный номер страницы не существует.
-
Paginator.get_elided_page_range(number, *, on_each_side=3, on_ends=2)¶ Возвращает основанный на 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)¶ Страница ведет себя как последовательность
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
EmptyPage¶ Возникает, когда
page()имеет допустимое значение, но на этой странице нет объектов.
Оба исключения являются подклассами InvalidPage, поэтому их можно обрабатывать с помощью except InvalidPage.