我想知道何时保存了UpdateView
的数据。
我有以下情况:我通过表单更新模型对象。我希望模型的更改只能在UpdateView
的{{1}}完成后保存。但是当我在form_valid
开始时打印对象属性时,它们已经更改为插入到表单中的新属性。
所以,当模型的更改完全保存时,如果我想用之前的值做某些事情,我将如何进行?
我对Django来说相对较新,我希望这个问题不会偏离轨道。
答案 0 :(得分:2)
form_valid
中收到的对象是未保存对象的对象,而不是从数据库中检索到的对象。
尝试
newobject = Mymodel.objects.get(pk=object.pk)
验证从数据库以这种方式检索的对象是否仍具有旧属性。
注意:这不适用于CreateView
,因为CreateView
中的对象尚未存在于数据库中,因此尚未拥有PK。
保存更新对象的实际工作在ModelFormMixin
第123行完成,其中一个是UpdateView
的Mixin类。来自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)
答案 1 :(得分:0)
在form_valid()
方法中调用form.save()
之前,对象不会保存到数据库中。如果您覆盖该方法并使用instance = form.save(commit=False)
保存,则在致电instance.save()
之前,它不会保存到数据库中。
但是,在post()
方法中调用form.is_valid()
时,会立即使用新值更新self.object
。因此,如果您在form_valid()
方法中访问self.object,则它已具有新值。
您可以从数据库中重新获取原始对象:
original_object = MyModel.objects.get(pk=self.object.pk)
如果您只是想知道哪些字段已更改,form.changed_data
可能就足够了。
答案 2 :(得分:0)
UpdateView.form_valid
的默认实现如下(直接来自Django):
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)
如果你想访问" old" 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)