Мне нужно сделать эквивалент... 'admin.site.unregister(Value)', но для модели, зарегистрированной в wagtailmodeladmin, используя 'modeladmin_register(Value)' в wagtail_hooks.py. Как ты это делаешь?
Как отменить регистрацию модели в wagtail modeladmin?
Ответы (3)
Я знаю, что это старый вопрос, но краткий ответ: «Нет эквивалента отмены регистрации».
В стандартном Django все модели, которые вы видите в административной области Django, были зарегистрированы аналогичным образом, поэтому отмена регистрации имеет смысл. В Wagtail область администрирования полностью настраиваемая, и «modeladmin» не является центральным элементом административной архитектуры, как аналогичное решение Django. Различные приложения в Wagtail не используют импорт/используют его для регистрации своих моделей. Поэтому невозможно «отменить регистрацию» любого из этих приложений с помощью modeladmin. Приложение «modeladmin» — это просто служебная вещь, помогающая вам добавлять интерфейсы для дополнительных моделей без необходимости разбираться во всех различных крючках, предоставляемых трясогузкой для таких вещей.
Таким образом, если «modeladmin» используется только для регистрации пользовательских моделей, потребность в методе «unregister» значительно снижается, потому что в большинстве случаев вы будете контролировать, какие модели вы регистрируете с помощью метода modeladmin_register, и поэтому вы должны иметь возможность просто «не регистрировать» их.
Нет встроенного способа сделать это, но если вы хотите добавить свой собственный способ:
# 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
]
Результат:
modeladmin_register(Value)
? Кажется, я не могу заставить это работать в моем случае, когда мне нужно отменить регистрацию/заменить запись ModelAdmin из другого приложения.
- person ladrua; 11.07.2019
В трясогузке я такой возможности не нашел, но для моего случая достаточно было исключить модель из главного меню, поэтому сделал следующее:
@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]