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

时间:2015-02-02 10:10:40

标签: python django django-admin django-admin-actions

我想在最初保存时禁用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()

我想禁用&#34;标题&#34;和&#34; n_comments&#34;。 我在admin.py文件中尝试过,但它没有禁用初始保存的字段。但是为了编辑其工作的字段,它使字段只读。

在admin.py中

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

Headling被禁用但仅限编辑。我想在创建对象时禁用它。即先保存。 谁能指导我这个?

5 个答案:

答案 0 :(得分:43)

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

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

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

答案 1 :(得分:8)

如果你想在创建过程中将字段设为只读,你应该反过来:

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

答案 2 :(得分:1)

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

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

它对我有用。

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:0)

其他方式是:

    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