You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据用户权限在Wagtail中隐藏/显示菜单项?

在Wagtail CMS中隐藏/显示菜单的实现方法

要在Wagtail后台灵活控制菜单的显示或隐藏,咱们可以通过调整wagtail_hooks.py里的钩子逻辑来实现,分两种常见场景给你说明:

一、添加并控制自定义菜单的显示

你已经在blog/wagtail_hooks.py中编写了注册自定义菜单项的代码,这段代码会给Wagtail后台新增一个「Site Admin」菜单。不过要补充上必要的导入语句,完整可运行的代码如下:

from wagtail.core import hooks
from wagtail.admin.menu import MenuItem
from django.urls import reverse
from django.utils.translation import gettext_lazy as _

@hooks.register('register_admin_menu_item')
def register_custom_admin_menu_item():
    return MenuItem(
        _('Site Admin'), 
        reverse('admin_menu'), 
        classnames='icon icon-folder-inverse', 
        order=20000
    )

如果要条件性隐藏这个自定义菜单(比如只让超级管理员看到),可以给MenuItem添加is_shown参数,传入一个自定义的判断函数:

from wagtail.core import hooks
from wagtail.admin.menu import MenuItem
from django.urls import reverse
from django.utils.translation import gettext_lazy as _

@hooks.register('register_admin_menu_item')
def register_custom_admin_menu_item():
    # 定义显示规则:仅超级管理员可见
    def show_to_superuser(request):
        return request.user.is_superuser
    
    return MenuItem(
        _('Site Admin'), 
        reverse('admin_menu'), 
        classnames='icon icon-folder-inverse', 
        order=20000,
        is_shown=show_to_superuser
    )

二、隐藏Wagtail自带的默认菜单

如果你想移除Wagtail自带的菜单(比如「Pages」「Media」「Settings」等),可以使用construct_main_menu钩子来修改现有菜单列表:

from wagtail.core import hooks

@hooks.register('construct_main_menu')
def hide_default_menu_items(request, menu_items):
    # 移除指定标签的菜单,这里以移除「Media」为例
    menu_items[:] = [item for item in menu_items if item.label != 'Media']
    
    # 也可以结合权限判断,比如非staff用户看不到「Pages」菜单
    if not request.user.is_staff:
        menu_items[:] = [item for item in menu_items if item.label != 'Pages']

这样就能根据需求灵活控制Wagtail后台菜单的显示与隐藏啦~

内容的提问来源于stack exchange,提问作者Prakash Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:08:01