我的模型文件中有一个带有不可编辑字段的模型。
class Table(models.Model):
label = models.CharField(max_length=40, editable=False)
在我的管理站点中,当更新现有的Table对象时,我无法编辑标签。很好,这正是我想要的约束条件。但是,当尝试使用管理站点创建对象时,该字段仍处于隐藏状态,因此我只能使用Shell创建Table对象。
如何使该字段仅在创建时出现,但是在更新时,它是只读的?谢谢。
答案 0 :(得分:1)
尝试在 admin.py
文件中使用readonly_fields
class TableAdmin(admin.ModelAdmin):
readonly_fields = ('label',)
admin.site.register(Table, TableAdmin)
答案 1 :(得分:0)
实际上 django admin 为这个功能提供了一个钩子,它叫做 ModelAdmin.get_readonly_fields
。您可以找到 documentation here。
因此可以编写以下代码来创建一个字段,该字段可以在创建对象时显示/添加但不能进一步编辑(通过管理站点)。
@admin.register(Table)
class TableAdmin(admin.ModelAdmin):
def get_readonly_fields(self, request, obj=None):
defaults = super().get_readonly_fields(request, obj=obj)
if obj: # if we are updating an object
defaults = tuple(defaults) + ('label', ) # make sure defaults is a tuple
return defaults
此外,如果您在该表上有多个字段,您可以使用 fields property 来设置排序(未明确排序的只读字段将显示在字段列表的末尾)。这种排序方法的缺点是,每次对模型进行更改时,您都必须记住将模型更改反映到 fields
属性。