UpdateView中的哪一点是保存的数据?

时间:2017-11-09 10:34:09

标签: python django orm

我想知道何时保存了UpdateView的数据。

我有以下情况:我通过表单更新模型对象。我希望模型的更改只能在UpdateView的{​​{1}}完成后保存。但是当我在form_valid开始时打印对象属性时,它们已经更改为插入到表单中的新属性。

所以,当模型的更改完全保存时,如果我想用之前的值做某些事情,我将如何进行?

我对Django来说相对较新,我希望这个问题不会偏离轨道。

3 个答案:

答案 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)
相关问题