Как использовать ADMIN_REMOVAL в мезонине
На моем новом мезонине я хочу удалить некоторые модели из меню администратора. Итак, я определил 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