如何根据用户权限在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
相关产品推荐
相关产品推荐

