Исключение PageNotAnInteger

Исключение PageNotAnInteger выбрасывается модулем пагинации Django, когда в метод page передается значение, не являющееся целым числом. Это исключение наследуется от page/InvalidPage/">InvalidPage и предназначено для обработки случаев, когда параметр страницы в запросе не может быть преобразован в целое число. Обычно это происходит, когда пользователь передает в URL-параметре строку, содержащую буквы или другие нечисловые символы.

Синтаксис

pythonfrom django.core.paginator import Paginator, PageNotAnInteger

paginator = Paginator(object_list, per_page)
try:
  page_obj = paginator.page(page_number)
except PageNotAnInteger:
  # обрабатываем ошибку неверного типа
  page_obj = paginator.page(1)

Пример

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

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

def article_list(request):
  articles = Article.objects.all().order_by('-created_at')
  paginator = Paginator(articles, 10)  # 10 статей на страницу
  
  page = request.GET.get('page', 1)
  try:
    articles_page = paginator.page(page)
  except PageNotAnInteger:
    # если page не целое число - показываем первую страницу
    articles_page = paginator.page(1)
  except EmptyPage:
    # если page выходит за пределы - показываем последнюю
    articles_page = paginator.page(paginator.num_pages)
  
  return render(request, 'articles/list.html', {'page_obj': articles_page})

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

python"Возвращается страница с запрошенным номером"

Пример

Пример обработки исключения в классе-представлении с использованием mixin:

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

class ArticleListView(ListView):
  model = Article
  template_name = 'articles/list.html'
  context_object_name = 'articles'
  paginate_by = 20

  def paginate_queryset(self, queryset, page_size):
    paginator = Paginator(queryset, page_size)
    page = self.request.GET.get('page')
    try:
      page_obj = paginator.page(page)
    except PageNotAnInteger:
      page_obj = paginator.page(1)
    except EmptyPage:
      page_obj = paginator.page(paginator.num_pages)
    return (paginator, page_obj, page_obj.object_list, page_obj.has_other_pages())

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

python"Исключение перехвачено, возвращена первая страница"

Пример

Пример использования в шаблоне с выводом сообщения об ошибке:

pythonfrom django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django.shortcuts import render
from myapp.models import Category

def category_list(request):
  categories = Category.objects.filter(is_active=True)
  paginator = Paginator(categories, 15)
  page = request.GET.get('page', 1)
  error_message = None
  
  try:
    categories_page = paginator.page(page)
  except PageNotAnInteger:
    categories_page = paginator.page(1)
    error_message = 'Некорректный номер страницы. Показана первая страница.'
  except EmptyPage:
    categories_page = paginator.page(paginator.num_pages)
    error_message = 'Страница не найдена. Показана последняя страница.'
  
  return render(request, 'categories/list.html', {
    'page_obj': categories_page,
    'error_message': error_message
  })

Результат выполнения кода при запросе с параметром page=abc:

python"Некорректный номер страницы. Показана первая страница."

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

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