PAYATHON 2026

Wagtail 页面如何在 get_context 出错时跳转到错误页?

数据阿明

结论

get_context() 应返回字典,不能返回重定向响应。数据获取失败时,可以在页面模型的 serve() 方法中捕获异常,并返回 Django 重定向响应。serve() 返回 HTTP 响应,适合处理跳转。

出现 get_context must return a dict,通常是因为异常处理代码在 get_context() 中返回了 redirect(...) 或其他非字典值。

示例

假设错误页配置了 Django URL 名称 error_page:

import logging

from django.shortcuts import redirect
from wagtail.models import Page

logger = logging.getLogger(__name__)


class DataPage(Page):
    def get_context(self, request, *args, **kwargs):
        context = super().get_context(request, *args, **kwargs)
        context["items"] = self.fetch_items()
        return context

    def serve(self, request, *args, **kwargs):
        try:
            return super().serve(request, *args, **kwargs)
        except Exception:
            logger.exception("Failed to build or serve DataPage")
            return redirect("error_page")

super().serve() 会继续执行页面的常规处理。如果调用 get_context() 时发生异常,这里会捕获异常,并返回指向 error_page 的重定向响应。请将 error_page 换成项目中实际配置的 URL 名称。

注意事项

  • get_context() 正常执行时,应返回包含页面模板所需数据的字典,例如 context。
  • 示例捕获所有 Exception,页面处理期间发生的多种错误都会被导向错误页。实际项目中,最好只捕获数据获取过程中预期会出现的异常,以免掩盖编程错误。
  • logger.exception() 会记录异常堆栈,方便排查问题。请确保错误页不会再次进入同一段失败逻辑,以免造成重定向循环。
  • 如果错误页是 Wagtail 页面,请确保它有可访问的 URL,并根据项目路由配置进行跳转。

备注:内容仅供参考。