0

在我的自定义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 时)......有时呢?

4

1 回答 1

0

这里的 django 文档中所述

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

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

于 2012-06-17T17:28:00.603 回答