在Django管理界面中移除“添加另一个”

43 投票
12 回答
28689 浏览
提问于 2025-04-15 15:56

每当我在编辑对象A时,它有一个指向对象B的外键,旁边总会出现一个“添加另一个”的选项。请问我怎么才能去掉这个选项呢?

我已经设置了一个用户,没有权限去添加对象B。虽然那个加号还是显示着,但我点击后却弹出“权限被拒绝”的提示。这看起来很糟糕。

我使用的是Django 1.0.2。

12 个回答

34

虽然这里提到的大部分解决方案都能奏效,但还有一种更简单的方法。这个方法可能是在Django的后续版本中引入的,早期的解决方案出现时还没有这个方法。(我现在使用的是Django 1.7)

如果你想去掉“添加另一个”这个选项,

class ... #(Your inline class)

    def has_add_permission(self, request):
        return False

如果你还想禁用“删除?”这个选项,可以在Inline类中添加以下方法。

    def has_delete_permission(self, request, obj=None):
        return False
68

以下的回答是我最初的回答,但它是错误的,并没有回答提问者的问题:

更简单的解决方案,不需要使用CSS技巧,也不需要修改Django的代码:

把这个加到你的Inline类里面:

max_num=0

(这只适用于内联表单,不适用于提问者问的外键字段)


上面的回答只对隐藏内联表单的“添加相关”按钮有用,而不适用于提问者要求的外键。

我写这个回答的时候,如果没记错的话,接受的答案是同时隐藏了这两个按钮,这也是我感到困惑的原因。

接下来这个链接似乎提供了一个解决方案(虽然使用CSS隐藏按钮似乎是最可行的,特别是当外键的“添加另一个”按钮在内联表单中时):

Django 1.7 从内联表单中移除添加按钮

4

过时的回答

Django 现在已经可以做到这一点了。


你有没有想过用 CSS 来直接隐藏这个按钮?也许这样做有点不太正规。

这个方法还没有经过测试,但我在想……

no-addanother-button.css

#_addanother { display: none }

admin.py

class YourAdmin(admin.ModelAdmin):
    # ...
    class Media:
        # edit this path to wherever
        css = { 'all' : ('css/no-addanother-button.css',) }

Django 的文档中有关于如何做到这一点的说明 -- 作为静态定义的媒体

注意/编辑:文档中提到这些文件会加上 MEDIA_URL,但我在实验中发现并没有。你的情况可能会有所不同。

如果你发现也是这样,有一个快速的解决办法……

class YourAdmin(admin.ModelAdmin):
    # ...
    class Media:
        from django.conf import settings
        media_url = getattr(settings, 'MEDIA_URL', '/media/')
        # edit this path to wherever
        css = { 'all' : (media_url+'css/no-addanother-button.css',) }

撰写回答