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

时间:2016-08-05 16:25:26

标签: django-admin wagtail modeladmin

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

3 个答案:

答案 0 :(得分: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('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
        ]

结果:

enter image description here

答案 1 :(得分:0)

我知道这是一个老问题,但简短的回答是“没有未注册的等价物”。

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

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

答案 2 :(得分:0)

我还没有在w中找到这种能力,但是就我而言,将模型从主菜单中排除就足够了,所以我接下来要做:

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