在 Wagtail 中如何为某些用户禁用某些管理菜单项?

In the Wagtail how to disable certain admin menu items for the certain users?

对于我想禁用某些菜单项的用户组。我想我会使用以下内容:

from wagtail.contrib.modeladmin.options import ModelAdmin as WModelAdmin

class WPartnerAdmin(WModelAdmin):
    ...
    def get_menu_item(self, order=None):
        menu_item = super().get_menu_item(order=order)
        # if (user_discrimination_logic):
        #    menu_item.is_shown = lambda *a: False
        return menu_item

但是我似乎无法访问Wagtail ModelAdmin中的request对象,因此不知道如何提取用户数据。有办法吗?

您可以使用 Wagtail 的 Hooks 功能,特别是 construct_main_menu 钩子:

在相应的应用程序中创建一个 wagtail_hooks.py 文件,内容如下(来自 Wagtail Docs):

from wagtail.core import hooks

@hooks.register('construct_main_menu')
def hide_explorer_menu_item_from_frank(request, menu_items):
  if request.user.username == 'frank':
    menu_items[:] = [item for item in menu_items if item.name != 'explorer']

对于大多数用途,无需更改任何代码即可通过 permissions system.

在设置 -> 组下,定义一个组,该组对他们应该能够编辑的对象(例如页面、图像和文档)具有权限,并确保选中 'Can access Wagtail admin' 权限。然后,在设置 -> 用户中,转到每个用户的角色选项卡并将他们添加到该组(并确保未选中管理员)。用户没有权限的任何菜单项都将被隐藏。

Wagtail 的内置权限系统会阻止用户查看实际的 modeladmin 对象,但可用选项仍会显示在菜单中,即使对于没有权限查看它们的组也是如此。当他们尝试查看对象时,没有查看权限的人会被发送到登录屏幕并告知他们没有足够的权限。

如果你想为特定用户隐藏管理菜单项,这些用户都是特定组甚至多个组的一部分,你可以使用 wagtail 的 construct_main_menu 钩。在应用程序文件夹中添加一个 wagtail_hooks.py 文件。菜单项已就地编辑。

要为“regular_user”或“bad_user”组中的用户删除名为“secrets1”和“secrets2”的两个菜单项,您可以这样做:

    from wagtail.core import hooks

    @hooks.register('construct_main_menu')
    def hide_explorer_items_from_users(request, menu_items):
        if request.user.groups.filter(name__in=["regular_user", "bad_user"]):
            menu_items[:] = [
                item for item in menu_items if item.name not in ['secrets1', 'secrets2']
            ]

这适用于删除项目,但如果计划以这种方式添加菜单项,则 Wagtail's Hooks Documentation warns you that menu items added this way will be missing associated javascript includes, so you should use the @register_admin_menu_item 挂钩用于添加项目。