You need to enable JavaScript to run this app. Django内置错误页面模板如何实现条件继承extends切换父模板
优惠活动
大模型
产品
解决方案
定价
更多

Django内置错误页面模板如何实现条件继承extends切换父模板

方案1:通过自定义上下文处理器实现动态基模板传入(推荐)

Django 的 {% extends %} 标签支持直接传入模板变量作为值,不需要在模板内写分支判断,你可以通过全局上下文处理器提前计算好要继承的基模板路径:

  1. 在你的应用下新建 context_processors.py,写入以下代码:
def get_dynamic_base_template(request):
    # 判断当前路径是否属于后台路径
    if '/beheerpaneel' in request.path:
        return {"base_template": "admin/index.html"}
    return {"base_template": "base.html"}
  1. 在项目 settings.py 中注册这个上下文处理器,找到 TEMPLATES 配置项,在 OPTIONS.context_processors 列表中新增:
TEMPLATES = [
    {
        # ... 其他原有配置
        'OPTIONS': {
            'context_processors': [
                # ... 其他原有上下文处理器,确保下面这行已经存在,能拿到request对象
                'django.template.context_processors.request',
                # 新增你自己的上下文处理器,替换成你的实际应用名
                '你的应用名.context_processors.get_dynamic_base_template',
            ],
        },
    },
]
  1. 修改你的503模板,第一行直接写:
{% extends base_template %}

后续所有404、500等错误模板都可以复用这个变量,直接第一行写相同的extends语句即可。


方案2:覆盖插件/内置错误视图,直接指定不同模板

如果你不想新增上下文处理器,也可以直接在URL层覆盖原有视图逻辑,自己控制模板选择:

针对django-maintenance-mode的503视图

  1. 在你的应用 views.py 中写自定义包装视图:
from maintenance_mode.views import maintenance_mode

def custom_maintenance_mode(request, *args, **kwargs):
    if '/beheerpaneel' in request.path:
        # 后台路径用继承admin基模板的503页面
        kwargs['template_name'] = '503_admin.html'
    else:
        # 前台路径用继承普通base的503页面
        kwargs['template_name'] = '503_public.html'
    return maintenance_mode(request, *args, **kwargs)
  1. 在项目根 urls.py 最顶部新增路由,覆盖插件的原有维护模式路由:
path('maintenance-mode/', custom_maintenance_mode, name='maintenance_mode'),
  1. 新建503_admin.html和503_public.html两个模板,分别第一行继承对应的基模板即可。

针对404、500等内置错误页

直接在根 urls.py 中指定自定义错误处理视图,逻辑和上面的503视图一致即可:

# 替换为你自己实现的对应视图
handler404 = '你的应用名.views.custom_404'
handler500 = '你的应用名.views.custom_500'

注意事项

如果使用上下文处理器方案适配500错误页,需要注意Django默认的500视图不会传入request对象、也不会调用全局上下文处理器,需要自定义500视图主动注入上下文:

from django.template import RequestContext
from django.shortcuts import render

def custom_500(request):
    context = RequestContext(request)
    return render(request, '500.html', context.flatten(), status=500)

内容的提问来源于stack exchange,提问作者Samoht

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 13:18:04