Как использовать 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

0 ответов

Другие вопросы по тегам