Класс Paginator

Класс Paginator применяется к QuerySet или списку объектов и возвращает объект пагинатора, который позволяет разбить данные на страницы с заданным количеством записей на каждой. Основные параметры конструктора: object_list - набор данных для разбиения (QuerySet, список или любой итерируемый объект), per_page - количество записей на странице. Дополнительные параметры: orphans - минимальное количество записей на последней странице (если записей меньше, они добавляются к предыдущей странице), allow_empty_first_page - разрешить или запретить пустую первую страницу. Пагинатор не выполняет запрос к базе данных до тех пор, пока не будет запрошена конкретная страница.

Синтаксис

pythonfrom django.core.paginator import Paginator

paginator = Paginator(object_list, per_page, orphans=0, allow_empty_first_page=True)

Пример

Давайте создадим пагинатор для списка статей, выводя по 10 записей на странице:

pythonfrom 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)

Результат выполнения кода:

python"25"
"3"
"range(1, 4)"

В примере видно, что всего 25 записей, которые разбиты на 3 страницы (на последней странице 5 записей).

Атрибуты класса Paginator

Класс Paginator предоставляет несколько полезных атрибутов:

pythonfrom 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)

Результат выполнения кода:

python"25"
"3"
"range(1, 4)"

Пример

Давайте получим конкретную страницу и выведем её объекты:

pythonfrom 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)

Результат выполнения кода:

python"article 11"
"article 12"
"article 13"
"article 14"
"article 15"
"article 16"
"article 17"
"article 18"
"article 19"
"article 20"

Параметр orphans

Параметр orphans позволяет объединить последнюю страницу с предыдущей, если на ней слишком мало записей:

pythonfrom 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)

Результат выполнения кода:

python"25"
"2"

В этом примере 25 записей разбиты на 2 страницы, так как на последней странице было бы 5 записей, что равно значению orphans.

Пример

Давайте обработаем исключение при запросе несуществующей страницы:

pythonfrom 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")

Результат выполнения кода:

python"Page does not exist"

Смотрите также

  • класс Page,
    который представляет отдельную страницу с данными
  • атрибут count,
    который возвращает общее количество записей
  • атрибут num_pages,
    который возвращает общее количество страниц
  • атрибут page_range,
    который возвращает диапазон номеров страниц