如何在 wagtail modeladmin 中取消注册模型?

问题描述 投票:0回答:3

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

django-admin wagtail modeladmin
3个回答
1
投票

我还没有在 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]

1
投票

没有内置的方法来做到这一点,但如果您想添加自己的方法:

# 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(hook_name, 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
        ]

结果:

enter image description here


0
投票

我知道这是一个老问题,但简短的答案是“没有注销等效项”。

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

因此,由于“modeladmin”仅用于注册自定义模型,因此大大减少了“取消注册”方法的需求,因为在大多数情况下,您将通过 modeladmin_register 方法控制要注册的模型,并且所以你应该能够“不注册”那些。

© www.soinside.com 2019 - 2024. All rights reserved.