РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
499 of 818 menu

Исключение 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,
    возникает при отсутствии запрашиваемого объекта
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить