Исключение EmptyPage

Исключение EmptyPage является подклассом InvalidPage и возникает при работе с пагинацией в Django, когда запрашиваемая страница существует, но не содержит ни одного объекта. Это происходит в ситуациях, когда номер страницы больше общего количества страниц или когда страница не содержит элементов из-за фильтрации данных. Обычно это исключение обрабатывается для корректного отображения сообщения пользователю или перенаправления на последнюю доступную страницу.

Синтаксис

pythonfrom django.core.paginator import Paginator, EmptyPage

paginator = Paginator(object_list, per_page)
try:
  page = paginator.page(page_number)
except EmptyPage:
  # Обработка пустой страницы
  page = paginator.page(paginator.num_pages)

Пример . Использование

Рассмотрим базовый пример обработки исключения EmptyPage при пагинации списка статей:

pythonfrom django.core.paginator import Paginator, EmptyPage
from myapp.models import Article

# Получаем все статьи
articles = Article.objects.all().order_by('-created_at')

# Создаем пагинатор с 10 статьями на страницу
paginator = Paginator(articles, 10)

# Пытаемся получить страницу с номером 5
try:
  page_obj = paginator.page(5)
  print(f"Articles on page 5: {page_obj.object_list.count()}")
except EmptyPage:
  print("Page 5 is empty. Redirecting to last page...")
  page_obj = paginator.page(paginator.num_pages)

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

python"Page 5 is empty. Redirecting to last page..."

Пример . С фильтрацией данных

Исключение EmptyPage может возникнуть при пагинации отфильтрованных данных, когда количество объектов на странице становится меньше ожидаемого:

pythonfrom django.core.paginator import Paginator, EmptyPage
from myapp.models import Article

# Фильтруем статьи по статусу
articles = Article.objects.filter(status='published')
paginator = Paginator(articles, 5)

# Пытаемся получить страницу с большим номером
page_number = 10
try:
  page_obj = paginator.page(page_number)
  print(f"Showing page {page_number}")
except EmptyPage:
  # Если страница пуста, показываем последнюю
  print(f"Page {page_number} is empty")
  page_obj = paginator.page(paginator.num_pages)
  print(f"Redirected to last page: {paginator.num_pages}")

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

python"Page 10 is empty"
"Redirected to last page: 3"

Пример . Во view-функции Django

Практическое использование EmptyPage во view-функции с обработкой исключения и перенаправлением:

pythonfrom django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage
from django.http import Http404
from myapp.models import Article

def article_list(request):
  articles = Article.objects.filter(status='published')
  paginator = Paginator(articles, 10)
  
  # Получаем номер страницы из GET-параметров
  page_number = request.GET.get('page', 1)
  
  try:
    page_obj = paginator.page(page_number)
  except EmptyPage:
    # Если страница пуста, перенаправляем на последнюю
    page_obj = paginator.page(paginator.num_pages)
    # Или можно вернуть 404 ошибку
    # raise Http404("Page is empty")
  
  return render(request, 'articles/list.html', {
    'page_obj': page_obj,
    'paginator': paginator,
  })

Пример . С обработкой нескольких исключений

Совместная обработка исключений EmptyPage и PageNotAnInteger для корректной работы пагинации:

pythonfrom django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from myapp.models import Article

articles = Article.objects.all().order_by('-views')
paginator = Paginator(articles, 15)

page_number = 5
try:
  page_obj = paginator.page(page_number)
  print(f"Successfully retrieved page {page_number}")
except PageNotAnInteger:
  # Если номер страницы не число, показываем первую
  print("Page number is not an integer")
  page_obj = paginator.page(1)
except EmptyPage:
  # Если страница пуста, показываем последнюю
  print("Page is empty")
  page_obj = paginator.page(paginator.num_pages)

print(f"Current page: {page_obj.number}")
print(f"Total pages: {paginator.num_pages}")

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

python"Page is empty"
"Current page: 4"
"Total pages: 4"

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

  • исключение InvalidPage,
    базовое исключение для всех ошибок пагинации
  • исключение PageNotAnInteger,
    возникает при нечисловом значении номера страницы
  • класс Paginator,
    основной класс для работы с пагинацией
  • исключение DoesNotExist,
    возникает при отсутствии запрашиваемого объекта