Исключение PageNotAnInteger
Исключение PageNotAnInteger выбрасывается модулем пагинации Django,
когда в метод page передается значение, не являющееся целым числом.
Это исключение наследуется от page/InvalidPage/">InvalidPage и предназначено для
обработки случаев, когда параметр страницы в запросе не может быть
преобразован в целое число. Обычно это происходит, когда пользователь
передает в URL-параметре строку, содержащую буквы или другие
нечисловые символы.
Синтаксис
from 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)
Пример
Рассмотрим базовый пример обработки исключения в функции представления:
from 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})
Результат выполнения кода при запросе с корректным параметром:
"Возвращается страница с запрошенным номером"
Пример
Пример обработки исключения в классе-представлении с использованием mixin:
from 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())
Результат выполнения кода при запросе с неверным типом параметра:
"Исключение перехвачено, возвращена первая страница"
Пример
Пример использования в шаблоне с выводом сообщения об ошибке:
from 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:
"Некорректный номер страницы. Показана первая страница."
Смотрите также
-
исключение
EmptyPage,
которое возникает при запросе несуществующей страницы -
исключение
InvalidPage,
которое является базовым для ошибок пагинации -
исключение
Http404,
которое используется для возврата ошибки 404 -
исключение
DoesNotExist,
которое возникает при отсутствии объекта в базе данных