Класс Paginator
Класс Paginator применяется к QuerySet или списку объектов
и возвращает объект пагинатора, который позволяет разбить данные
на страницы с заданным количеством записей на каждой.
Основные параметры конструктора: object_list - набор
данных для разбиения (QuerySet, список или любой итерируемый
объект), per_page - количество записей на странице.
Дополнительные параметры: orphans - минимальное
количество записей на последней странице (если записей меньше,
они добавляются к предыдущей странице), allow_empty_first_page
- разрешить или запретить пустую первую страницу.
Пагинатор не выполняет запрос к базе данных до тех пор,
пока не будет запрошена конкретная страница.
Синтаксис
from django.core.paginator import Paginator
paginator = Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)
Пример
Давайте создадим пагинатор для списка статей, выводя по 10 записей на странице:
from myapp.models import Article
from django.core.paginator import Paginator
articles = Article.objects.all()
paginator = Paginator(articles, 10)
print(paginator.count)
print(paginator.num_pages)
print(paginator.page_range)
Результат выполнения кода:
"25"
"3"
"range(1, 4)"
В примере видно, что всего 25 записей, которые
разбиты на 3 страницы (на последней странице 5
записей).
Атрибуты класса Paginator
Класс Paginator предоставляет несколько полезных атрибутов:
from myapp.models import Article
from django.core.paginator import Paginator
articles = Article.objects.all()
paginator = Paginator(articles, 10)
# Общее количество записей
print(paginator.count)
# Общее количество страниц
print(paginator.num_pages)
# Диапазон номеров страниц
print(paginator.page_range)
Результат выполнения кода:
"25"
"3"
"range(1, 4)"
Пример
Давайте получим конкретную страницу и выведем её объекты:
from myapp.models import Article
from django.core.paginator import Paginator
articles = Article.objects.all()
paginator = Paginator(articles, 10)
page_obj = paginator.page(2)
for article in page_obj.object_list:
print(article.title)
Результат выполнения кода:
"article 11"
"article 12"
"article 13"
"article 14"
"article 15"
"article 16"
"article 17"
"article 18"
"article 19"
"article 20"
Параметр orphans
Параметр orphans позволяет объединить последнюю
страницу с предыдущей, если на ней слишком мало записей:
from myapp.models import Article
from django.core.paginator import Paginator
# Если на последней странице меньше 5 записей,
# они будут добавлены к предыдущей странице
articles = Article.objects.all()
paginator = Paginator(articles, 10, orphans=5)
print(paginator.count)
print(paginator.num_pages)
Результат выполнения кода:
"25"
"2"
В этом примере 25 записей разбиты на 2
страницы, так как на последней странице было бы 5
записей, что равно значению orphans.
Пример
Давайте обработаем исключение при запросе несуществующей страницы:
from myapp.models import Article
from django.core.paginator import Paginator, EmptyPage
articles = Article.objects.all()
paginator = Paginator(articles, 10)
try:
page_obj = paginator.page(10)
except EmptyPage:
print("Page does not exist")
Результат выполнения кода:
"Page does not exist"
Смотрите также
-
класс
Page,
который представляет отдельную страницу с данными -
атрибут
count,
который возвращает общее количество записей -
атрибут
num_pages,
который возвращает общее количество страниц -
атрибут
page_range,
который возвращает диапазон номеров страниц