Как отменить регистрацию модели в wagtail modeladmin?

Мне нужно сделать эквивалент... 'admin.site.unregister(Value)', но для модели, зарегистрированной в wagtailmodeladmin, используя 'modeladmin_register(Value)' в wagtail_hooks.py. Как ты это делаешь?


person user3665916    schedule 05.08.2016    source источник


Ответы (3)


Я знаю, что это старый вопрос, но краткий ответ: «Нет эквивалента отмены регистрации».

В стандартном Django все модели, которые вы видите в административной области Django, были зарегистрированы аналогичным образом, поэтому отмена регистрации имеет смысл. В Wagtail область администрирования полностью настраиваемая, и «modeladmin» не является центральным элементом административной архитектуры, как аналогичное решение Django. Различные приложения в Wagtail не используют импорт/используют его для регистрации своих моделей. Поэтому невозможно «отменить регистрацию» любого из этих приложений с помощью modeladmin. Приложение «modeladmin» — это просто служебная вещь, помогающая вам добавлять интерфейсы для дополнительных моделей без необходимости разбираться во всех различных крючках, предоставляемых трясогузкой для таких вещей.

Таким образом, если «modeladmin» используется только для регистрации пользовательских моделей, потребность в методе «unregister» значительно снижается, потому что в большинстве случаев вы будете контролировать, какие модели вы регистрируете с помощью метода modeladmin_register, и поэтому вы должны иметь возможность просто «не регистрировать» их.

person ababic    schedule 05.02.2017

Нет встроенного способа сделать это, но если вы хотите добавить свой собственный способ:

# 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
        ]

Результат:

введите здесь описание изображения

person rich tier    schedule 13.04.2018
comment
Не могли бы вы обновить пример, просто перевернув/заменив 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]
person Gleb    schedule 27.07.2019
comment
Это то, что сработало для меня. Я просто хотел скрыть различные кнопки в админке, и это прекрасно работает. Например, я уже создал подкласс панели Snippets, поэтому теперь у меня есть дубликат, и я хочу удалить оригинал: ``` @hooks.register('construct_main_menu') def hide_snippets(request, menu_items): menu_items[:] = [элемент для элемента в menu_items if item.name != 'snippets'] ``` - person jwsmithers; 29.04.2020