Как отменить регистрацию модели в трясогузке на моделадмине?
Мне нужно сделать эквивалент... 'admin.site.unregister(Value)', но для модели, зарегистрированной с помощью wagtailmodeladmin, используя modeladmin_register(Value) в wagtail_hooks.py. Как ты это делаешь?
2 ответа
Я знаю, что это старый вопрос, но короткий ответ: "Не существует незарегистрированного эквивалента".
В стандартном Django все модели, которые вы видите в админке Django, были зарегистрированы аналогичным образом, поэтому отмена регистрации имеет смысл. В Wagtail область администрирования полностью настраивается, и "modeladmin" не является центральным элементом архитектуры администратора, как аналогичное решение Django. Различные приложения в Wagtail не используют импорт / используют его для регистрации своих собственных моделей. Следовательно, невозможно отменить регистрацию любого из этих приложений с помощью modeladmin. Приложение "modeladmin" - это просто утилита, помогающая добавлять интерфейсы для дополнительных моделей без необходимости понимать все различные ловушки, предоставляемые трясогузкой, чтобы делать такие вещи.
Таким образом, поскольку modeladmin используется только для регистрации пользовательских моделей, необходимость в методе "отменять регистрацию" значительно снижается, поскольку в большинстве случаев вы будете контролировать, какие модели вы регистрируете с помощью метода modeladmin_register, и так Вы должны быть в состоянии просто "не регистрировать" их.
Я не нашел такой возможности у трясогузки, но в моем случае достаточно было исключить модель из главного меню, поэтому я сделал следующее:
@hooks.register('construct_main_menu')
def hide_longlaw_order(request, menu_items):
menu_items[:] = [item for item in menu_items if 'longclaworders' not in item.url]
Нет встроенного способа сделать это, но если вы хотите добавить свой собственный путь:
# helpers.py
from wagtail import hooks
def replace_hook(hook_name, original_fn):
hooks._hooks[hook_name].remove((original_fn, 0))
def inner(fn):
hooks.register('register_page_listing_buttons', fn)
return fn
return inner
Допустим, мы хотели удалить все кнопки из списка, кроме "Добавить дочернюю страницу":
# wagtail_hooks.py
import helpers
@replace_hook('register_page_listing_buttons', page_listing_buttons)
def remove_redundant_buttons(page, page_perms, is_parent=False):
buttons = page_listing_buttons(page, page_perms, is_parent)
if isinstance(page, models.BasePage):
return buttons
else:
# for non-subclasses-of-BasePage allow only adding children
allowed_urls = ['add_subpage']
return [
item for item in buttons
if item.url and resolve(item.url).url_name in allowed_urls
]
Результат: