You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django自定义Admin站点模型视图失效问题求助

问题原因与修复方案

这个问题我之前也踩过坑,不是Django的Bug,是你自定义AdminSite的实现方式有问题~

为什么会出现这个情况?

你在__init__里直接把admin.site._registry的内容复制到自定义site的_registry里,但这里的核心问题是:默认admin.site里注册的所有ModelAdmin实例,都是和admin.site这个默认站点绑定死的。当你访问模型实例页面时,渲染页面用的是这些已经绑定了默认站点的ModelAdmin,它们会优先使用关联站点的site_header和site_title,自然就变回默认样式了。

两种修复方法

方法1:手动重新注册模型到自定义站点

最稳妥的方式是把需要管理的模型,手动注册到你的CustomSite实例上,而不是直接复制默认站点的注册表:

from django.contrib import admin
# 导入你需要管理的模型,包括Django自带的和自定义的
from django.contrib.auth.models import User, Group
from your_app.models import YourModel

class CustomSite(admin.AdminSite):
    site_header = 'Custom Header'
    site_title = 'Custom Title'

custom_site = CustomSite('custom_admin')

# 逐个注册模型
custom_site.register(User)
custom_site.register(Group)
custom_site.register(YourModel)

这样每个ModelAdmin都会和你的自定义站点绑定,所有页面(包括模型实例页)都会使用你设置的自定义头部。

方法2:批量迁移默认站点的注册(适合模型较多的情况)

如果不想手动一个个注册,可以遍历默认站点的注册表,为每个模型创建新的ModelAdmin实例并注册到自定义站点:

from django.contrib import admin

class CustomSite(admin.AdminSite):
    site_header = 'Custom Header'
    site_title = 'Custom Title'

custom_site = CustomSite('custom_admin')

# 遍历默认站点的注册项,重新注册到自定义站点
for model, model_admin in admin.site._registry.items():
    # 创建一个新的ModelAdmin子类,避免复用默认站点的绑定实例
    new_admin_class = type(
        f"Custom{model_admin.__class__.__name__}",
        (model_admin.__class__,),
        {}
    )
    custom_site.register(model, new_admin_class)

这里关键是不能直接复用默认的model_admin实例,必须创建新的子类,这样新的ModelAdmin才会和自定义站点关联。

验证修复效果

修改完成后,重启Django服务,再次访问模型实例页面,就能看到自定义的头部正常显示了~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:02:58