如何在Django admin的ModelAdmin列表页隐藏而非禁用添加模型按钮
实现方案
你当前直接重写has_add_permission返回False的写法是全局禁用添加权限,所以所有涉及该模型添加操作的场景都会被限制。要实现仅列表页隐藏添加按钮、其他场景保留添加功能,只需要在权限判断中增加「当前请求是否为列表页请求」的校验逻辑即可。
适配Django 3.2+版本的代码如下:
@admin.register(Document) class DocumentAdmin(admin.ModelAdmin): list_display = ("id", "name", "template", "file") fields = ["template", "name", "file"] def has_add_permission(self, request): # 先获取默认的添加权限判断结果 original_perm = super().has_add_permission(request) # 若本身无添加权限直接返回,无需后续判断 if not original_perm: return False # 构造当前模型列表页对应的视图名称 changelist_view_name = f"admin:{self.opts.app_label}_{self.opts.model_name}_changelist" # 仅当当前请求为列表页请求时,返回无添加权限(隐藏添加按钮) if request.resolver_match.view_name == changelist_view_name: return False # 其他场景保留原有添加权限 return original_perm
实现逻辑说明
- Django Admin每个操作页面对应独立的视图名称,列表页对应视图名称格式为
admin:{应用名}_{模型名}_changelist - 仅当匹配到列表页视图时,我们才会阻断添加权限的返回,其他场景(包括内联添加、关联字段添加弹窗、OneToOne关系绑定添加等)的请求不会命中该判断,会保留正常的添加功能
- 该写法不会破坏Django原生的权限体系,原本就没有添加权限的用户依然无法执行添加操作
内容的提问来源于stack exchange,提问作者J_Zar
相关产品推荐
相关产品推荐

