【问题标题】:Django Forms: possible to update only some parameters?Django Forms:可以只更新一些参数吗?
【发布时间】:2013-12-01 02:41:35
【问题描述】:

假设我有一个非常简单的模型,

class Entity(models.Model):
    foo = models.TextField(blank=True, default='')
    bar = models.TextField(blank=True, default='')

一个模型表单

class EntityForm(forms.ModelForm):
    class Meta:
        model = models.Entity

我正在执行以下代码:

#preparation
entity = Entity()
entity.foo = 'foo'
entity.bar = 'bar'
entity.save()

params = {
    'foo': 'oof'
}

form = EntityForm(params, instance=entity)
entity = form.save()

entity.bar 的值丢失。 使用表单部分更新模型的正确方法是什么?

【问题讨论】:

    标签: python django django-forms modelform


    【解决方案1】:

    您可以覆盖表单的 save 方法以仅更新更改的字段:

    class EntityForm(forms.ModelForm):
        class Meta:
            model = models.Entity
    
        def save(self, commit=True):
            from django.forms import save_instance
    
            if self.instance.pk is None:
                fail_message = 'created'
            else:
                fail_message = 'changed'
            return save_instance(self, self.instance, self.changed_data,
                                 fail_message, commit, construct=False)
    

    【讨论】:

    • 这看起来很有希望,但行不通。 entity.bar 的现有值设置为空字符串。在新保存方法的开头打印 self.changed_data 给我:['foo','bar']。但我没有更改 entity.bar。
    • 如果我们通过initial 形成这样的形式:form = EntityForm(params, instance=entity, initial={'foo': entity.foo, 'bar': entity.bar})。如果这项工作可以在表单构造函数中完成。
    • changed_data 仅在给出初始值时才会生成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多