django admin:如何禁用外键的编辑和删除链接

Mas*_*ero 3 python django

在 django 管理站点中,如果模型有外键,默认情况下它将是一个选择输入,并且有如下三个链接(编辑、添加、删除)。如何仅为外键禁用这些链接?如果使用 has_delete_permission,它们也不能以自己的更改形式删除。

默认: 默认

预期的: 后

小智 10

在 admin.py 中,在模型 ModelAdmin 类下创建一个 def 。选择与foreign_key字段相关的添加、更改或删除选项,保留您想要隐藏的字段并删除(或将布尔值从False更改为True)以显示您想要显示的字段:

class YourModelAdmin(admin.ModelAdmin):
    ...
    def get_form(self, request, obj=None, **kwargs):
        form = super(YourModelAdmin, self).get_form(request, obj, **kwargs)
        field = form.base_fields["your_foreign_key_field"]
        field.widget.can_add_related = False
        field.widget.can_change_related = False
        field.widget.can_delete_related = False
        return form
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@GregSadetsky,我做到了。:) (2认同)

Art*_*Art 7

它不完全是记录在案的功能。此外,formfield_for_dbfield是一团糟(就像大多数django.contrib.admin)。但这是我找到的最干净的方法,对我来说效果很好。

class MyAdmin(django.contrib.admin.ModelAdmin):

    def formfield_for_dbfield(self, *args, **kwargs):
        formfield = super().formfield_for_dbfield(*args, **kwargs)

        formfield.widget.can_delete_related = False
        formfield.widget.can_change_related = False
        # formfield.widget.can_add_related = False  # can change this, too
        # formfield.widget.can_view_related = False  # can change this, too

        return formfield
Run Code Online (Sandbox Code Playgroud)