Используйте существующую страницу для ошибки 404/505 в Wagail
Я использую самую последнюю версию Wagtail, 6.3.1 на данный момент.
Я хочу использовать определенную страницу для ошибок 404 и 500, чтобы она была в одном ряду с остальными страницами сайта.
Я создал два представления:
class Error404View(View):
def get(self, request, *args, **kwargs):
site_settings = SiteSettings.for_request(request)
if site_settings.error_404_page:
serve = site_settings.error_404_page.serve(request, *args, **kwargs)
return serve
else:
return HttpResponseNotFound("NOT FOUND")
class Error500View(View):
def get(self, request, *args, **kwargs):
site_settings = SiteSettings.for_request(request)
if site_settings.error_500_page:
return site_settings.error_500_page.serve(request, *args, **kwargs)
else:
return HttpResponseServerError("INTERNAL SERVER ERROR")
(я знаю, что мне также придется переопределить код возврата HTTP при обслуживании).
А в urls.py настроены вот эти:
handler404 = Error404View.as_view()
handler500 = Error500View.as_view()
if settings.DEBUG:
# Error test pages
urlpatterns += [path("404/", Error404View.as_view())]
urlpatterns += [path("500/", Error500View.as_view())]
Но вывод этих страниц прост:
<!DOCTYPE HTML>
<html lang="nl" dir="ltr">
<head>
<title>Office365</title>
</head>
<body>
<h1>Office365</h1>
</body>
</html>
(для тестирования я выбрал страницу с содержанием под названием Office365).
Я нашел этот связанный вопрос на SO, но он был задан много версий назад, так что, возможно, он больше не применим: Wagtail: программный рендеринг страницы в представлении на основе классов
Итак, как я могу получить содержимое указанной страницы в коде представления?
Спасибо!
Предположительно, ваше поле site_settings.error_404_page
/ site_settings.error_500_page
является ForeignKey для модели Page, так что это даст вам экземпляр базового класса Page (который просто содержит поля, общие для всех типов страниц, такие как title), а не конкретного класса, в котором определены все поля содержимого страницы. Чтобы получить полный объект, используйте page.specific
:
serve = site_settings.error_404_page.specific.serve(request, *args, **kwargs)