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

Django Admin:如何禁用特定BankAccount实例的编辑链接?

解决Django Admin中无权限实例的编辑链接显示问题

你遇到的这个问题很典型——默认的Django Admin列表页编辑链接是基于全局权限判断的,不会自动识别你重写的has_change_permission(针对单个对象的权限逻辑)来隐藏链接。要解决这个问题,我们可以自定义列表中的编辑链接字段,针对每个实例动态判断权限后决定是否显示编辑按钮。

具体实现步骤

首先导入需要的工具模块:

from django.utils.html import format_html
from django.urls import reverse

然后修改你的BankAccountAdmin类,替换默认的编辑入口为自定义字段:

class BankAccountAdmin(admin.ModelAdmin):
    # 将默认的编辑链接替换为我们自定义的字段
    list_display = ('iban', 'owner', 'custom_edit_link')

    def has_change_permission(self, request, obj=None):
        return obj is None or obj.owner == request.user
    
    def custom_edit_link(self, obj):
        # 针对当前实例检查用户是否有修改权限
        if self.has_change_permission(self.admin_site.request, obj):
            # 生成对应实例的编辑页面URL(替换your_app_name为你的实际应用名)
            edit_url = reverse('admin:your_app_name_bankaccount_change', args=[obj.pk])
            return format_html('<a href="{}">编辑</a>', edit_url)
        # 无权限时返回空内容,不显示链接
        return ""
    
    # 设置自定义字段在列表页的显示名称
    custom_edit_link.short_description = '操作'

核心逻辑说明

  1. 动态权限校验:custom_edit_link方法会为每个BankAccount实例调用你已定义的has_change_permission,确保只有用户有权限的实例才会显示编辑链接。
  2. 安全生成链接:用format_html输出HTML链接,避免XSS风险,这是Django官方推荐的安全输出方式。
  3. URL反向解析:通过reverse动态生成编辑页面的URL,需要把代码中的your_app_name替换为BankAccount模型所在的实际应用名称。

如果还需要隐藏删除链接,你可以用完全相同的思路添加custom_delete_link字段,同时重写has_delete_permission方法来控制删除权限。

内容的提问来源于stack exchange,提问作者Cristian Accino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:15:39