Django内置错误页面模板如何实现条件继承extends切换父模板
方案1:通过自定义上下文处理器实现动态基模板传入(推荐)
Django 的 {% extends %} 标签支持直接传入模板变量作为值,不需要在模板内写分支判断,你可以通过全局上下文处理器提前计算好要继承的基模板路径:
- 在你的应用下新建
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"}
- 在项目
settings.py中注册这个上下文处理器,找到TEMPLATES配置项,在OPTIONS.context_processors列表中新增:
TEMPLATES = [ { # ... 其他原有配置 'OPTIONS': { 'context_processors': [ # ... 其他原有上下文处理器,确保下面这行已经存在,能拿到request对象 'django.template.context_processors.request', # 新增你自己的上下文处理器,替换成你的实际应用名 '你的应用名.context_processors.get_dynamic_base_template', ], }, }, ]
- 修改你的503模板,第一行直接写:
{% extends base_template %}
后续所有404、500等错误模板都可以复用这个变量,直接第一行写相同的extends语句即可。
方案2:覆盖插件/内置错误视图,直接指定不同模板
如果你不想新增上下文处理器,也可以直接在URL层覆盖原有视图逻辑,自己控制模板选择:
针对django-maintenance-mode的503视图
- 在你的应用
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)
- 在项目根
urls.py最顶部新增路由,覆盖插件的原有维护模式路由:
path('maintenance-mode/', custom_maintenance_mode, name='maintenance_mode'),
- 新建
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
相关产品推荐
相关产品推荐

