在第一次保存对象时使 django 模型字段只读或在管理员中禁用

Posted

技术标签:

【中文标题】在第一次保存对象时使 django 模型字段只读或在管理员中禁用【英文标题】:make django model field read only or disable in admin while saving the object first time 【发布时间】:2015-04-01 06:02:07 【问题描述】:

我想在最初保存时禁用 django admin 中模型中的几个字段。

"<input type="text" id="disabledTextInput" class="form-control" placeholder="Disabled input">"

像这样。

我的模型是:

class Blogmodel(models.Model):
    tag = models.ForeignKey(Tag)
    headline = models.CharField(max_length=255)
    image=models.ImageField(upload_to=get_photo_storage_path, null=True, blank=False)
    body_text = models.TextField()
    pub_date = models.DateField()
    authors = models.ForeignKey(Author)
    n_comments = models.IntegerField()

我想禁用“标题”和“n_cmets”。 我在 admin.py 文件中尝试过,但它没有在初始保存时禁用这些字段。但是为了编辑其工作的字段,它使字段只读。

在 admin.py 中

class ItemAdmin(admin.ModelAdmin):
    exclude=("headline ",)
    def get_readonly_fields(self, request, obj=None):
        if obj:
            return ['headline']
        else:
            return []

标题被禁用但仅用于编辑。我想在创建对象时禁用它。即首先保存。 有人可以指导我吗?

【问题讨论】:

你为什么不使用 readonly_fields 属性呢? 它适用于编辑对象而不是第一次创建对象。 如果你不覆盖get_readonly_fields,它对两者都有效。 【参考方案1】:

只做editable=False,同时在模型中添加字段

headline = models.CharField(max_length=255,editable=False)

它不可编辑,您无法从管理面板看到该字段,但您可以从模型中的方法向它们添加值

【讨论】:

【参考方案2】:

其他方式是:

    def get_form(self, request, obj=None, **kwargs):
        form = super().get_form(request, obj=None, **kwargs)

        if obj is None:

            form.base_fields["my_field"].disabled = True

        return form

【讨论】:

【参考方案3】:

如果您想在创建期间将该字段设置为只读,则应以相反的方式进行:

def get_readonly_fields(self, request, obj=None):
    if obj is None:
        return ['headline']
    return []

【讨论】:

非常感谢。但它没有显示输入框被禁用。 干草它不适用于编辑!!。编辑时未禁用。 对不起,我误解了这个问题,以为你只想禁用它来创建......否则总是return ['headline']......不需要If子句......【参考方案4】:

无需覆盖get_readonly_fields。最简单的解决方案是:

class ItemAdmin(admin.ModelAdmin):
    exclude=("headline ",)
    readonly_fields=('headline', )

使用readonly_fields 时,您不能覆盖get_readonly_fields,因为默认实现读取readonly_fields 变量。所以只有当你必须有一些逻辑来决定哪个字段应该是只读的时候才覆盖它。

【讨论】:

我不知道为什么人们不在这里使用你的简单建议 这是要走的路! 很好的解决方案!【参考方案5】:

为了在保存初始对象和编辑时禁用它,我们也可以这样做

class ItemAdmin(admin.ModelAdmin):
    def get_readonly_fields(self, request, obj=None):
        if obj is None:
            return ['headline']
        else:
            return ['headline']
        return []

它对我有用。

【讨论】:

以上是关于在第一次保存对象时使 django 模型字段只读或在管理员中禁用的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 1.11 admin 中创建新对象时评估只读字段

Django admin:将必填字段设为只读

Kendo UI - 如何在编辑时使特定字段只读,同时在剑道网格中创建可编辑?

Django Admin-禁用编辑并删除特定模型的“保存”按钮

Django Admin中的动态只读字段

Django 仅序列化一个字段而不是相关字段中的整个模型(只读)