在我的新夹层网站中,我想从管理菜单中删除一些模型。所以我用我想在管理菜单中看到的模型定义了ADMIN_MENU_ORDER
。这导致其他模型不在列表中(BlogPost
,ThreadedComment
,Site
,Redirect
),列在我想要的模型下面。
所以我用它来删除它们:
ADMIN_REMOVAL = ('blog.BlogPost',
'generic.ThreadedComment',
'sites.Site',
'redirects.Redirect',)
(我只是剪切并粘贴默认的ADMIN_MENU_ORDER
。)
但由于ImportError
中的mezzanine.urls
(第19-31行),这无效:
# Remove unwanted models from the admin that are installed by default with
# third-party apps.
for model in settings.ADMIN_REMOVAL:
try:
model = tuple(model.rsplit(".", 1))
exec("from %s import %s" % model)
except ImportError:
pass
else:
try:
admin.site.unregister(eval(model[1]))
except NotRegistered:
pass
所以我改变了ADMIN_REMOVAL
:
ADMIN_REMOVAL = ('blog.models.BlogPost',
'generic.models.ThreadedComment',
'django.contrib.sites.models.Site',
'django.contrib.redirects.models.Redirect',)
但是,虽然此代码行中没有ImportError
或NotRegistered
,但这仍然没有效果。
似乎还有一些东西,我还没有理解。
更新 我做了一些调试。这条线
admin.site.unregister(eval(model[1]))
来自mezzanine/urls.py
的(上面引用过)实际上调用mezzanine.boot.lazy_admin.unregister
,如下所示:
def unregister(self, *args, **kwargs):
self._deferred.append(("unregister", args, kwargs))
看起来应该在调用引导过程mezzanine.boot.lazy_admin.lazy_registration
之后,应用所有延迟注册和取消注册:
def lazy_registration(self):
for name, deferred_args, deferred_kwargs in self._deferred:
getattr(AdminSite, name)(self, *deferred_args, **deferred_kwargs)
但实际上mezzanine.boot.lazy_admin.lazy_registration
在mezzanine/urls.py
中的代码>之前被称为,它会尝试从ADMIN_REMOVAL
取消注册模型。
(我添加了这样的打印语句并得到以下输出:)
mezzanine/urls.py
for model in settings.ADMIN_REMOVAL:
[...]
try:
print 'unregistering', model[1]
admin.site.unregister(eval(model[1]))
except NotRegistered:
pass
mezzanine/boot/lazy_admin.py
def lazy_registration(self):
print 'lazy_registration occurs'
for name, deferred_args, deferred_kwargs in self._deferred:
getattr(AdminSite, name)(self, *deferred_args, **deferred_kwargs)
输出
lazy_registration occurs
unregistering BlogPost
unregistering ThreadedComment
unregistering Site
unregistering Redirect
我会在Github
上发布此问题