您如何在 wagtail modeladmin 中注销模型?

How do you unregister a model in wagtail modeladmin?

我需要做等同于... 'admin.site.unregister(Value)' 但对于在 wagtail_hooks.py 中使用 'modeladmin_register(Value)' 向 wagtailmodeladmin 注册的模型。你是怎么做到的?

我知道这是一个老问题,但简短的回答是 "There is no unregister equivalent"。

在标准的 Django 中,您在 Django 的管理区域中看到的所有模型都以类似的方式注册,因此在那里取消注册是有意义的。在 Wagtail 中,管理区域是完全自定义的,并且 'modeladmin' 不像 Django 的类似解决方案那样是管理架构的中心。 Wagtail 中的各种应用程序不使用 import/use 它来注册自己的模型。因此,无法 'unregister' 使用 modeladmin 的任何这些应用程序。 'modeladmin' 应用程序只是一个实用程序,可帮助您为其他模型添加接口,而无需了解 wagtail 提供的所有各种挂钩来执行此类操作。

因此,'modeladmin' 仅用于注册自定义模型,大大减少了对 'unregister' 方法的需求,因为在大多数情况下,您可以控制要注册的模型正在通过 modeladmin_register 方法注册,因此您应该可以只 'not 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

假设我们想从列表视图中删除除 "add child page":

之外的所有按钮
# 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
        ]

结果:

我还没有在 wagtail 中发现这样的功能,但对于我来说,从主菜单中排除一个模型就足够了,所以我做了下一步:

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