使用现有页面解决 Wagail 中的错误 404/505

问题描述 投票:0回答:1

我目前使用的是最新版本的 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的内容页面)。

这似乎是因为返回的 Page 对象的模板是基本模板,而不是特定于页面的模板:

Wrong template

我在SO上找到了这个相关问题,但它来自许多版本之前,所以也许它不再适用:Wagtail:在基于类的视图中以编程方式渲染页面

那么;如何在视图代码中获取指定页面的内容?

谢谢!

django wagtail
1个回答
0
投票

假设您的

site_settings.error_404_page
/
site_settings.error_500_page
字段是 Page 模型的外键,因此将为您提供基本 Page 类的实例(仅包含所有页面类型通用的字段,例如标题),而不是定义所有页面内容字段的特定类。要获取完整对象,请使用
page.specific
:

serve = site_settings.error_404_page.specific.serve(request, *args, **kwargs)
© www.soinside.com 2019 - 2024. All rights reserved.