Используйте существующую страницу для ошибки 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)
Вернуться на верх