2017-11-09 19 views
2

UpdateViewに与えられたデータがいつ保存されたのか疑問に思っていました。UpdateViewのどの時点でデータが保存されていますか?

私は次のような状況があります。モデルオブジェクトをフォームで更新します。私は、UpdateViewform_validが通過した後にのみ、モデルの変更が保存されることを期待しています。しかし、オブジェクト属性をform_validの先頭に印刷すると、すでにフォームに挿入されている新しい属性に変更されています。

モデルの保存が正確に変更されたとき、以前の値で何かしたい場合はどうすればよいですか?

私はDjangoに比較的新しいです。この質問があまりにも遠く離れていないことを願っています。

答えて

2

form_validで受信したオブジェクトは、未保存のオブジェクトであり、データベースから取得したオブジェクトではありません。

オブジェクトは、データベースからこの方法を取得したが、まだ古い属性を持っていることを確認するには

newobject = Mymodel.objects.get(pk=object.pk) 

を試してみてください。

注:CreateViewのオブジェクトはまだデータベースに存在しないため、まだPKを持っていないため、CreateViewでは機能しません。

更新されたオブジェクトを保存する実際の作業は、UpdateViewのMixinクラスの1つであるModelFormMixin行123で行われます。 Source Codeから:

def form_valid(self, form): 
    """If the form is valid, save the associated model.""" 
    self.object = form.save() 
    return super().form_valid(form) 
0

form.save()form_valid()方法で呼び出されるまでオブジェクトはデータベースに保存されていません。メソッドをオーバーライドしてinstance = form.save(commit=False)で保存すると、instance.save()にコールするまでデータベースに保存されません。

ただし、メソッドでform.is_valid()が呼び出された場合、self.objectは新しい値で直ちに更新されます。したがって、form_valid()メソッドでself.objectにアクセスすると、すでに新しい値が設定されています。

あなたは、データベースから元のオブジェクトを再フェッチできます

original_object = MyModel.objects.get(pk=self.object.pk) 

変更したばかりのフィールドを知りたい場合は、form.changed_dataはあなたのために十分であるかもしれません。

0

(ストレートジャンゴから)次のようにUpdateView.form_validのデフォルトの実装は次のとおりです。

def form_valid(self, form): 
     """ 
     If the form is valid, save the associated model. 
     """ 
     self.object = form.save() 
     return super(ModelFormMixin, self).form_valid(form) 

あなたがform_valid以内に「古い」のインスタンスにアクセスしたい場合は、次の操作を行うことができます:

def form_valid(self, form): 
    updated_instance = form.save(commit=False) 
    original_instance = MyModel.objects.get(pk=updated.pk) 

    # Do what ever you want with these two instances. 
    # ... 

    # The form is saved in the super call below, hence the 
    # commit=False above. 
    return super(self, MyView).form_valid(form) 
関連する問題