Django自定义管理站点在模型vi中不工作

2024-04-23 20:53:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我实现了一个自定义的管理网站与自定义标题,当查看“主页”和“应用程序”的意见,一切都很顺利。但是,当我检查“Model”实例时,头会返回到默认值。你知道吗

我该怎么解决这个问题?我做错什么了吗?或者把它看作是Django的一个bug是合理的吗?你知道吗

问题演示

应用程序视图: good header

模型视图: bad header

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配置urls.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中的INSTALLED_APPS。你知道吗

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


Tags: 项目django实例frompy模型import视图
1条回答
网友
1楼 · 发布于 2024-04-23 20:53:29

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

以下是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')

相关问题 更多 >