使用自定义管理网站

时间:2015-09-16 15:07:29

标签: django django-admin python-3.4 django-authentication django-1.8

我使用Django auth和默认的管理站点实现了身份验证管理,但后来我想用自己的AdminSite重写一些行为:

class OptiAdmin(admin.AdminSite):
    site_title = "Optimizer site's admin"
    #...Other stuff here

然后注册我自己的模特:

admin_site = OptiAdmin(name='opti_admin')
admin.site.register(MyModel, MyModelAdmin)
#Other stuff here

但是当我去管理网站时,我只能看到我刚刚注册的模型,这对我来说听起来不错,但我希望看到这个新的自定义网站中的所有其他应用程序模型,包括auth'用户和群组,我不知道如何自动执行此操作,如默认管理员所做的那样,请帮助:)。

4 个答案:

答案 0 :(得分:14)

  1. 使用简单的__init__()覆盖创建您自己的AdminSite。
  2. urls.py
  3. 中导入您的管理员

    以最小的努力取代Django Admin并获得autodiscover()行为是可能的。这是以典型的django-admin startproject project方式生成的项目结构:

    project/
        manage.py
        project/
            __init__.py
            settings.py
            urls.py
            wsgi.py
            admin.py  # CREATE THIS FILE
    

    project / admin.py: (我认为在项目级别执行此操作最有意义。)

    from django.contrib.admin import *  # PART 1
    
    class MyAdminSite(AdminSite):
        site_header = "My Site"
    
        def __init__(self, *args, **kwargs):
            super(MyAdminSite, self).__init__(*args, **kwargs)
            self._registry.update(site._registry)  # PART 2
    
    site = MyAdminSite()
    

    project / urls.py(摘录):

    from . import admin  # PART 3
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    ]
    

    第1部分是简单的Python。通过将django.contrib.admin中的所有内容导入您的命名空间,它可以作为替代品。我想你不必这样做,但它有助于保持期望。第3部分,只需连接您的管理员。第2部分是真正的技巧。正如documentation所说,调用autodiscover()来完成工作。所有自动发现都会通过INSTALLED_APPS尝试导入名为admin.py的文件。导入运行代码当然和代码执行相同的操作来注册模型(例如decorator和示例method)。没有魔法。您必须使用自定义管理员注册您的模型(如文档所示)。

    自动发现看起来比使用register_to kwarg更智能。这表明您可以自己调用autodiscover()传递自己的管理员。不;那里没有连线(未来的功能?)。赋值发生here,并使用装饰器固定到本机AdminSite实例here(或here)。 Django contrib模型注册到该实例,任何第三方库也将注册。这不是你能搞定的东西。

    尽管如此,_registry只是一个字典映射。让Django自动发现所有内容,然后只需复制映射。这就是self._registry.update(site._registry)工作的原因。 "自"是您自定义的AdminSite实例," site"是Django的实例,您可以使用其中任何一个注册模型。

    (最后注意:如果缺少模型,那是因为导入顺序。在复制_registry之前,需要向Django的AdminSite注册。直接注册到自定义管理员可能是最简单的事情。)

答案 1 :(得分:10)

Django文档建议将SimpleAdminConfig与自定义管理网站结合使用。

INSTALLED_APPS = (
    ...
    'django.contrib.admin.apps.SimpleAdminConfig',
    ...
)

这可以防止模型使用默认AdminSite注册。

文档似乎假设您将单独导入模型并将其添加到自定义管理站点:

from django.contrib.auth.models import Group, User
from django.contrib.auth.admin import GroupAdmin, UserAdmin

admin_site.register(Group, GroupAdmin)
admin_site.register(User, UserAdmin)

如果您在许多应用中都有模型,这将是非常重复的。它没有提供任何建议如何使用您的自定义网站自动注册所有应用程序中的模型。

您可以尝试修补猴子admin,并用自己的admin.site替换。{/ p>

from django.contrib import admin
admin.site = OptiAdmin(name='opti_admin')

然后,当代码名为admin.site.register()时,它会向您的管理站点注册模型。此代码必须在任何模型注册之前运行。您可以尝试将其放入应用的AppConfig,并确保您的应用高于django.contrib.admin

答案 2 :(得分:0)

添加到JCotton的出色答案中:

使用django 2.0,在自定义管理网站中覆盖site_headersite_title仅适用于index页面。

要使其与所有管理员视图一起使用,请使用以下内容扩展JCotton的代码:

    def __init__(self, *args, **kwargs):
        super(MyAdminSite, self).__init__(*args, **kwargs)
        self._registry.update(site._registry)  # PART 2

        for model, model_admin in self._registry.items():
            model_admin.admin_site = self

答案 3 :(得分:0)

只需在您的CustomAdminSite类中包含 init 方法即可。

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