Обработка ошибок постраничной разбивки
Теперь, когда постраничная разбивка работает, в представление можно добавить обработку исключений, вызванных ошибками постраничной разбивки.
Параметр page, используемый представлением для извлечения заданной страницы, потенциально может применяться с неправильными значениями, такими как несуществующие номера страниц или строковое значение, которое нельзя использовать в качестве номера страницы. Мы выполним соответствующую обработку ошибок для таких случаев.
Пройдите по URL-адресу http://127.0.0.1:8000/blog/?page=3 в своем браузере.
Вы должны увидеть следующую ниже страницу с ошибкой:
При извлечении страницы 3 объект Paginator выдает исключение EmptyPage, поскольку она находится вне диапазона.
Подлежащих отображению результатов нет. Давайте обработаем эту ошибку в представлении.
Отредактируйте файл views.py приложения blog, добавив необходимую инструкцию импорта и видоизменив представление post_list, как показано ниже:
from django.shortcuts import render, get_object_or_404
from .models import Post
from django.core.paginator import Paginator, EmptyPage
def post_list(request):
post_list = Post.published.all()
# Постраничная разбивка с 3 постами на страницу
paginator = Paginator(post_list, 3)
page_number = request.GET.get('page', 1)
try:
posts = paginator.page(page_number)
except EmptyPage:
# Если page_number находится вне диапазона, то
# выдать последнюю страницу
posts = paginator.page(paginator.num_pages)
return render(request,
'blog/post/list.html',
{'posts': posts})
Мы добавили блок try ... except, чтобы при извлечении страницы управлять исключением EmptyPage.
Если запрошенная страница находится вне диапазона, то мы возвращаем последнюю страницу результатов.
Мы получаем общее число страниц посредством paginator.num_pages. Общее число страниц совпадает с номером последней страницы.
Снова пройдите по URL-адресу http://127.0.0.1:8000/blog/?page=3 в своем браузере.
Теперь исключение управляется представлением, и последняя страница результатов возвращается, как показано ниже:
Данное представление также должно обрабатывать случай, когда в параметре page передается нечто отличное от целого числа.
Пройдите по URL-адресу http://127.0.0.1:8000/blog/?page=asdf в своем браузере.
Вы должны увидеть следующую ниже страницу ошибки:
В этом случае при извлечении страницы asdf объект Paginator выдает исключение PageNotAnInteger, поскольку номера страниц могут быть только целыми числами. Давайте обработаем эту ошибку в представлении.
Отредактируйте файл views.py приложения blog, добавив необходимую инструкцию импорта и видоизменив представление post_list, как показано ниже:
from django.shortcuts import render, get_object_or_404
from .models import Post
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
def post_list(request):
post_list = Post.published.all()
# Постраничная разбивка с 3 постами на страницу
paginator = Paginator(post_list, 3)
page_number = request.GET.get('page')
try:
posts = paginator.page(page_number)
except PageNotAnInteger:
# Если page_number не целое число, то
# выдать первую страницу
posts = paginator.page(1)
except EmptyPage:
# Если page_number находится вне диапазона, то
# выдать последнюю страницу результатов
posts = paginator.page(paginator.num_pages)
return render(request,
'blog/post/list.html',
{'posts': posts})
Мы добавили новый блок except, чтобы при извлечении страницы управлять исключением PageNotAnInteger.
Если запрошенная страница не является целым числом, то мы возвращаем первую страницу результатов.
Снова пройдите по URL-адресу http://127.0.0.1:8000/blog/?page=asdf в своем браузере.
Теперь исключение обрабатывается представлением, и первая страница результатов возвращается, как показано ниже на рисунке:
Теперь постраничная разбивка постов блога полностью реализована.
Подробнее о классе Paginator можно узнать на странице https://docs.djangoproject.com/en/5.0/ref/paginator/.