从 Django-admin 中删除默认应用程序

Posted

技术标签:

【中文标题】从 Django-admin 中删除默认应用程序【英文标题】:Remove default apps from Django-admin 【发布时间】:2011-01-21 11:19:26 【问题描述】:

默认情况下,在 Django-admin 中有用户、组和站点应用程序。如何删除组和网站?

我试图从根 URL 中删除 admin.autodiscover()。然后,当我在我的应用模型中的某处添加类似 admin.site.register(User, UserAdmin) 的内容时,我得到了一个 AlreadyRegistered 异常(这是相当正确的 - 模型用户已经在 django.contrib.auth 中注册)。

【问题讨论】:

【参考方案1】:

在你知道肯定会加载的 admin.py 中,试试:

admin.site.unregister(User)
admin.site.unregister(Group)
admin.site.unregister(Site)

【讨论】:

你需要导入它们(或者我做了): from django.contrib.sites.models import Site from django.contrib.auth.models import * 如果您在 django 应用程序之前加载应用程序,此方法将不起作用。我必须这样做以确保我的应用程序的自定义注册模板覆盖 3.2 中的默认 django 注册模板。如果在 django 应用程序之前加载带有 admin.py 的应用程序,这将导致 NotRegistered('The model %s is not registered' % model.__name__) 错误。无论 INSTALLED_APPS 顺序如何,@user2745509 下面的解决方案都可以工作,但不太干净。【参考方案2】:

除了上述之外,请仔细检查您在“settings.py”中对“INSTALLED_APPS”的排序

INSTALLED_APPS = [
    # django apps first
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # custom apps below
    'my_app'
]

否则会报错。见这里:Issue with Django admin registering an inline user profile admin

【讨论】:

是的,这有帮助。您的应用必须低于其他应用。否则,用户模型仍然来自原始应用程序(contrib.auth),而不是您的。【参考方案3】:

为了摆脱我必须在 admin.py 中执行的用户和组:

from django.contrib import admin
# Need to import this since auth models get registered on import.
import django.contrib.auth.admin
import django.contrib.auth.models
from django.contrib import auth

admin.site.unregister(auth.models.User)
admin.site.unregister(auth.models.Group)

【讨论】:

如果您像我一样在 django 应用程序之前加载本地应用程序,这是唯一可行的方法。我必须这样做以确保我的本地应用程序的自定义注册模板覆盖 3.2 中的默认 django 注册模板。如果您的应用在 django 应用之前加载,则接受的答案将导致 NotRegistered('The model %s is not registered' % model.__name__) 错误。【参考方案4】:

如果你得到:

django.contrib.admin.sites.NotRegistered:模型组不是 已注册

然后确保您的 INSTALLED_APPS 顺序正确,如下所示:

enter code hereINSTALLED_APPS = (
# [1] Django apps
'django.contrib.auth',
...

# [2] your custom apps
'anyproject.anytuff',
)

【讨论】:

【参考方案5】:

遍历所有应用,并取消注册他们已注册的任何模型。

from django.apps import apps


# De-register all models from other apps
for app_config in apps.get_app_configs():
    for model in app_config.get_models():
        if admin.site.is_registered(model):
            admin.site.unregister(model)


# Register only those models you want
...

【讨论】:

这是一个最佳答案。不确定在哪里添加它,因为在 AppConfig.ready 中为时已晚。我在 INSTALLED_APPS 中注册的第一个应用程序的 admin.py 顶部添加了这个。另外,我添加了让用户不受影响的条件,例如:if not app_config.name == 'django.contrib.auth' # before the model loop【参考方案6】:
from django.apps import apps

for model in apps.get_models():
    if model.__name__ and admin.site.is_registered(model):
        admin.site.unregister(model)

这将取消注册所有模型,具体取决于放置此代码的应用程序的位置以及它在 INSTALLED_APPS 中的顺序,因此请确保您想要在管理员中使用的应用程序放置在此代码所在的应用程序之后。

例如:如果此代码放在用户应用程序中,它将取消注册用户之前的所有模型,并且可以注册用户之后的所有模型。

【讨论】:

以上是关于从 Django-admin 中删除默认应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 1.9 中删除 django-admin 中的保存并继续编辑按钮,使其不存在?

如何配置 azure 应用以在从应用中删除用户时发送通知

自定义django-admin命令

自定义django-admin命令

尝试快速从数组中删除时,不应删除 tableview 单元格中的最后一个单元格

隐藏实用程序类构造函数:实用程序类不应具有公共或默认构造函数