Исключение EmptyPage
Исключение EmptyPage является подклассом InvalidPage и
возникает при работе с пагинацией в Django, когда запрашиваемая
страница существует, но не содержит ни одного объекта. Это
происходит в ситуациях, когда номер страницы больше общего
количества страниц или когда страница не содержит элементов
из-за фильтрации данных. Обычно это исключение обрабатывается
для корректного отображения сообщения пользователю или
перенаправления на последнюю доступную страницу.
Синтаксис
from 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
при пагинации списка статей:
from 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)
Результат выполнения кода:
"Page 5 is empty. Redirecting to last page..."
Пример . С фильтрацией данных
Исключение EmptyPage может возникнуть при пагинации
отфильтрованных данных, когда количество объектов на странице
становится меньше ожидаемого:
from 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}")
Результат выполнения кода:
"Page 10 is empty"
"Redirected to last page: 3"
Пример . Во view-функции Django
Практическое использование EmptyPage во view-функции
с обработкой исключения и перенаправлением:
from 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 для корректной работы пагинации:
from 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}")
Результат выполнения кода:
"Page is empty"
"Current page: 4"
"Total pages: 4"
Смотрите также
-
исключение
InvalidPage,
базовое исключение для всех ошибок пагинации -
исключение
PageNotAnInteger,
возникает при нечисловом значении номера страницы -
класс
Paginator,
основной класс для работы с пагинацией -
исключение
DoesNotExist,
возникает при отсутствии запрашиваемого объекта