如何在 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 Cookbook-22如何将一对一关系添加为Admin内联字段