为什么Django ModelForm会在save()调用之前更改它的内部实例对象..有时候?

时间:2012-06-17 12:19:33

标签: python django

在我的自定义UpdateView中,我想将表单的字段内容与此表单应该更改的对象字段进行比较(它以instance参数的形式提供给表单构造函数并保存作为self.object)。我在form_valid() method中尝试了这个:

if self.object.content != form.save(commit=False).content
   ...

和这个

if self.object.content != form.cleaned_data['content']
   ....

在这两种情况下,此测试都不会通过,因为两个值都相等。嗯..它变得有趣,我在django shell中做了一些简单的测试来仔细检查这个行为。实际上我得到了一些非常尴尬的结果。看看这个:

>>> class ArticleForm(forms.ModelForm):
...     class Meta:
...         model=Article
...         fields = ('title',)

>>> a = Article.objects.all()[0]
>>> a
<Article: 12345>
>>> form = ArticleForm(data={'title': 'python-power'}, instance=a)
>>> a
<Article: python-power>

>>> a = Article.objects.all()[0]
>>> a
<Article: 12345>
>>> form = ArticleForm(data={'title': 'python-power'}, instance=a)
>>> a
<Article: 12345>

一切正常吗?为什么我需要保存方法(特别是使用commit = True),如果实例对象仍然改变了......有时候好吗?

1 个答案:

答案 0 :(得分:0)

如django文档here

中所述
  

如果使用commit = False调用save(),则它将返回尚未保存到数据库的对象。在这种情况下,您可以在生成的模型实例上调用save()。如果要在保存对象之前对对象执行自定义处理,或者如果要使用其中一个专用模型保存选项,则此选项非常有用。默认情况下,commit为True

实例仅更新但尚未保存到数据库。您需要调用save方法将这些更改传输到数据库。