在Django管理员中创建对象时如何显示不可编辑的字段?

时间:2018-09-27 15:00:11

标签: django django-admin

我的模型文件中有一个带有不可编辑字段的模型。

class Table(models.Model):
    label = models.CharField(max_length=40, editable=False)

在我的管理站点中,当更新现有的Table对象时,我无法编辑标签。很好,这正是我想要的约束条件。但是,当尝试使用管理站点创建对象时,该字段仍处于隐藏状态,因此我只能使用Shell创建Table对象。

如何使该字段仅在创建时出现,但是在更新时,它是只读的?谢谢。

2 个答案:

答案 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 属性。