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シェルでいくつかの簡単なテストを行いました。実際、私はその時本当に厄介な結果を得ました。これをチェックしてください:

>>> 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で)saveメソッドが必要なのですか?

4

1 に答える 1

0

ここのdjangoドキュメントで説明されているように

commit=False を指定して save() を呼び出すと、データベースにまだ保存されていないオブジェクトが返されます。この場合、結果のモデル インスタンスで save() を呼び出すのはあなた次第です。これは、オブジェクトを保存する前にカスタム処理を行いたい場合や、特殊なモデル保存オプションのいずれかを使用したい場合に便利です。commit はデフォルトで True です

インスタンスは更新されるだけで、データベースにはまだ保存されていません。saveこれらの変更をデータベースに転送するには、メソッドを呼び出す必要があります。

于 2012-06-17T17:28:00.603 に答える