Python Django自定义管理站点不';无法在模型视图中工作

Python Django自定义管理站点不';无法在模型视图中工作,python,django,django-admin,Python,Django,Django Admin,我实现了一个带有自定义标题的自定义管理站点,当查看“主页”和“应用”视图时,一切都进行得很顺利。但是,当我检查“Model”实例时,头返回到默认值 我该如何解决这个问题?我做了什么错事还是认为这是Django的错误? 问题演示 应用程序视图: 模型视图: MCVE 创建新项目和应用程序,并在应用程序中的文件sites.py中: from django.contrib import admin class CustomSite(admin.AdminSite): site_head

我实现了一个带有自定义标题的自定义管理站点,当查看“主页”和“应用”视图时,一切都进行得很顺利。但是,当我检查“Model”实例时,头返回到默认值

我该如何解决这个问题?我做了什么错事还是认为这是Django的错误? 问题演示 应用程序视图:

模型视图:

MCVE 创建新项目和应用程序,并在应用程序中的文件
sites.py
中:

from django.contrib import admin


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

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._registry.update(admin.site._registry)


custom_site = CustomSite('custom_admin')
然后,在项目URL配置中
URL.py

from django.contrib import admin
from django.urls import path

from adminfail.sites import custom_site

urlpatterns = [
    path('custom_admin/', custom_site.urls),
]
另外,将该应用程序添加到
settings.py
中的
已安装的应用程序中


然后,如果您从命令行创建一个超级用户并运行该应用程序,您将看到在检查模型实例时,自定义标题会返回到默认值。

好的,所以我终于知道我做错了什么。我正在从默认的管理站点复制注册表,但是注册表是模型及其
ModelAdmin
实例之间的映射,
ModelAdmin
实例有一个属性
admin\u site
,它告诉Django这是在哪个
AdminSite
下注册的。因此,为了解决这个问题,我简单地复制了
ModelAdmin
,并将
admin\u site
属性设置为my
CustomSite
。如果你改变了其他东西,最好是
deepcopy
it,这是一个相对未经测试的技巧/黑客,可能会有其他后果,但现在一切都进展得非常顺利

以下是
CustomSite
中的代码:

from copy import copy
from django.apps import apps
from django.contrib import admin


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

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for model,model_admin in admin.site._registry.items():
            new_model_admin = copy(model_admin)
            new_model_admin.admin_site = self
            self._registry[model] = new_model_admin


custom_site = CustomSite('custom_admin')

好吧,我终于明白我做错了什么。我正在从默认的管理站点复制注册表,但是注册表是模型及其
ModelAdmin
实例之间的映射,
ModelAdmin
实例有一个属性
admin\u site
,它告诉Django这是在哪个
AdminSite
下注册的。因此,为了解决这个问题,我简单地复制了
ModelAdmin
,并将
admin\u site
属性设置为my
CustomSite
。如果你改变了其他东西,最好是
deepcopy
it,这是一个相对未经测试的技巧/黑客,可能会有其他后果,但现在一切都进展得非常顺利

以下是
CustomSite
中的代码:

from copy import copy
from django.apps import apps
from django.contrib import admin


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

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        for model,model_admin in admin.site._registry.items():
            new_model_admin = copy(model_admin)
            new_model_admin.admin_site = self
            self._registry[model] = new_model_admin


custom_site = CustomSite('custom_admin')