如何在 django admin 上添加只读内联

Posted

技术标签:

【中文标题】如何在 django admin 上添加只读内联【英文标题】:How to add readonly inline on django admin 【发布时间】:2013-06-11 16:24:00 【问题描述】:

我正在使用 django 1.4 并且我有一个 many2many 字段,所以在创建管理站点时我想将此字段添加为内联,这里有一些代码:

class SummaryInline(admin.TabularInline):
    model = ParserError.summaries.through


class MyClassAdmin(admin.ModelAdmin):
    list_display = ('classifier', 'name', 'err_count', 'supported')
    fields = ('classifier', 'name', 'err_count', 'err_classifier', 'supported')
    inlines = (SummaryInline,)
    readonly_fields = ('classifier', 'err_count')

所以我的问题是,我怎样才能使内联字段只读?

【问题讨论】:

【参考方案1】:

经过一段时间的尝试,我找到了感谢this answer的名称,所以我检查了self.opts.local_fields的名称,找到了中间表的名称并将其添加到readonly_fields,设置can_delete为假。

class SummaryInline(admin.TabularInline):
    model = ParserError.summaries.through
    readonly_fields = ('myclasssummary',)
    can_delete = False

很简单,但花了我一段时间,所以我发现在此处添加它是个好主意。

【讨论】:

我不确定您是否可以/应该使用can_delete = False。您可以改用def has_delete_permission(self, request, obj=None): return False。请参阅文档:docs.djangoproject.com/en/2.1/ref/contrib/admin readonly_fields 中的myclasssummary 是什么?是summaries模型的表名还是字段名?【参考方案2】:

此外,如果您不想添加/删除行,您可以添加这些定义。

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

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

【讨论】:

class SummaryInline(admin.TabularInline):下面添加这些函数【参考方案3】:

您可以通过添加使整个内联只读:

class UnitsInline(admin.TabularInline):

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

这将阻止任何人从管理员那里编辑条目。

另一个阻止、添加、删除并将所有内联字段显示为只读的示例:

class ReadOnlyInline(admin.TabularInline):
    def has_change_permission(self, request, obj=None):
        return False

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

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

    def get_readonly_fields(self, request, obj=None):
        return list(super().get_fields(request, obj))

【讨论】:

我使用的是 django 1.11,这会导致没有相关记录显示。我猜是因为我无法编辑它们? 您必须将要显示的内联字段添加为只读字段。我会用一个例子来更新我的答案。 对我来说,即使对于拥有这些权限的人,这也会阻止内联呈现。 这对我有用,但 get_readonly_fields 不是必需的。还要确保指定model【参考方案4】:

感谢凯瓦尔帕布

class UnitsInline(admin.TabularInline):
    model = Units
    extra = 0
    verbose_name = 'Units'
    verbose_name_plural = 'Units of company'

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

【讨论】:

为什么has_add_permission是**,对我来说会报错 他想加粗。忽略**

以上是关于如何在 django admin 上添加只读内联的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin:如何只保存内联模型而不是父模型

Django Admin Cookbook-22如何将一对一关系添加为Admin内联字段

django admin如何在只读字段上显示小部件

如何在 Django Admin 中设置另一个内联标题?

Django Admin,我的表的所有内容都没有显示和内联问题

Django admin 不同的内联用于更改和添加视图