我目前使用的是最新版本的 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 对象的模板是基本模板,而不是特定于页面的模板:
我在SO上找到了这个相关问题,但它来自许多版本之前,所以也许它不再适用:Wagtail:在基于类的视图中以编程方式渲染页面
那么;如何在视图代码中获取指定页面的内容?
谢谢!
假设您的
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)