【问题标题】:django admin: how to disable edit and delete link for foreignkeydjango admin:如何禁用外键的编辑和删除链接
【发布时间】:2019-06-02 07:37:44
【问题描述】:

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

默认值:

预期:

【问题讨论】:

标签: python django


【解决方案1】:

这并不完全是一个记录在案的功能。此外,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

【讨论】:

    【解决方案2】:

    在 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"]
    • @arielkaluzhny 我建议发布一个单独的答案,以便您可以使用完整的代码格式显示您的答案!干杯
    • 谢谢@GregSadetsky,我做到了。 :)
    【解决方案3】:

    (将我的评论转移到答案)

    以上答案非常适合常规管理页面。要使其在管理员内联中工作(例如: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,无论如何这就是我一直在寻找的东西,而且效果很好!
    • 谢谢两位,已修复!
    【解决方案4】:
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['xxx'].widget.can_delete_related = False
    

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    猜你喜欢
    • 2011-05-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 1970-01-01
    • 2012-09-10
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多