【问题标题】:How do you unregister a model in wagtail modeladmin?如何在 wagtail modeladmin 中注销模型?
【发布时间】:2016-12-12 03:24:13
【问题描述】:

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

【问题讨论】:

    标签: django-admin wagtail modeladmin


    【解决方案1】:

    我还没有在鹡鸰中找到这种能力,但就我而言,从主菜单中排除模型就足够了,所以我做了下一步:

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

    【讨论】:

    • 这对我有用。我只是想在管理面板中隐藏各种按钮,这非常有效。例如,我已经对 Snippets 面板进行了子类化,所以现在我有一个副本并想删除原来的:``` @hooks.register('construct_main_menu') def hide_sn-ps(request, menu_items): menu_items[: ] = [如果 item.name != 'sn-ps'] ```
    【解决方案2】:

    没有内置方法,但如果您想添加自己的方法:

    # 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 条目的情况。
    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-06
      • 2017-05-24
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-30
      • 2020-01-03
      相关资源
      最近更新 更多