- 通过简单的
__init__()
覆盖创建自己的AdminSite。
- 在
urls.py
中导入您自己的管理员。
通过最小的努力,可以替换Django Admin并获取autodiscover()
行为。这是一个典型的django-admin startproject project
生成的项目结构:
project/
manage.py
project/
__init__.py
settings.py
urls.py
wsgi.py
admin.py
project/admin.py:(我认为在项目级别上这样做是最有意义的。)
from django.contrib.admin import *
class MyAdminSite(AdminSite):
site_header = "My Site"
def __init__(self, *args, **kwargs):
super(MyAdminSite, self).__init__(*args, **kwargs)
self._registry.update(site._registry)
site = MyAdminSite()
项目/urls.py(片段):
from . import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
]
第一部分是简单的Python代码。通过从django.contrib.admin
导入所有内容到您的命名空间中,它作为一个可替换组件。我想你不一定要这样做,但它有助于保持期望。第三部分,只需连接您的管理页面。第二部分才是真正的技巧所在。就像文档所说的那样,调用autodiscover()
来完成工作。自动发现实际上只是浏览INSTALLED_APPS
尝试导入一个叫做admin.py
的文件而已。导入当然会运行代码,而这些代码正在做与您注册模型相同的事情(例如使用装饰器和方法示例)。没有什么魔法。您不必将您的模型与您自定义的管理页面注册(如文档所述)。
autodiscover()
看起来比它聪明,因为它有一个register_to
kwarg。这表明您可以自己调用autodiscover()并传递自己的管理页面。不,那里没有任何连接线(未来功能?)。赋值发生在这里,并且固定为原生AdminSite实例这里(或使用装饰器时这里)。Django contrib模型注册到该实例,因此也将注册第三方库。您无法挂钩到这个功能。
这里的技巧是,_registry
只是一个字典映射。让Django自动发现所有内容,然后只需复制映射。这就是为什么self._registry.update(site._registry)
有效。 "self"是您的自定义AdminSite实例,"site"是Django的实例,您可以使用其中任何一个注册您的模型。
(最后注意:如果模型丢失,那是因为导入顺序问题。所有注册到Django的AdminSite需要在您复制_registry
之前完成。直接注册到您自定义的管理页面可能是最简单的方法。)
self._registry.update()
步骤,Django 在自动注册/构建其 AdminSite 后,然后你复制映射?这可能会覆盖现有的值,因此请在__init__()
中调用该方法后设置您的 AdminSite 属性(如 site_title、header、url 等)。 - JCottonDjango 2.0
中测试了这段代码。设置site_header
或site_title
仅适用于index
和app index
页面。然而,app models
仍显示为Django Administration
。 - Da CodeKid