【发布时间】:2019-06-02 07:37:44
【问题描述】:
在 django 管理站点中,如果模型有外键,默认情况下它将是一个选择输入,并且有三个链接(编辑、添加、删除),如下所示。 如何禁用这些链接仅适用于外键? 如果使用has_delete_permission,它们也不能以自己的更改形式删除。
【问题讨论】:
-
它有帮助。 can_delete_related 在小部件中...
在 django 管理站点中,如果模型有外键,默认情况下它将是一个选择输入,并且有三个链接(编辑、添加、删除),如下所示。 如何禁用这些链接仅适用于外键? 如果使用has_delete_permission,它们也不能以自己的更改形式删除。
【问题讨论】:
这并不完全是一个记录在案的功能。此外,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
【讨论】:
在 admin.py 中,在您的模型 ModelAdmin 类下创建一个 def。选择与 foreign_key 字段相关的 Add、Change 或 Delete 选项,保留您想要隐藏和删除的选项(或将布尔值从 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
【讨论】:
StackedInline)。有什么建议么? :)
get_formset!像魅力一样工作:def get_formset(self, request, obj=None, **kwargs): formset = super().get_formset(request, obj, **kwargs) field = formset.form.base_fields["impersonating"]
(将我的评论转移到答案)
以上答案非常适合常规管理页面。要使其在管理员内联中工作(例如:admin.StackedInline),请使用 get_formset 而不是 get_form:
def get_formset(self, request, obj=None, **kwargs):
formset = super().get_formset(request, obj, **kwargs)
field = formset.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 formset
【讨论】:
get_formset 前面缺少def :-) 否则看起来很棒!
return formset,无论如何这就是我一直在寻找的东西,而且效果很好!
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['xxx'].widget.can_delete_related = False
【讨论】: