Django ModelForm is_valid自动保存实例

时间:2012-09-07 02:00:04

标签: django modelform

我发现Django中的ModelForm非常易于使用,节省了大量的开发时间。

然而,当我意识到is_valid实际上保存了ModelForm时,我陷入了困境!我想知道这是预期的行为,还是我做错了什么?

我发生的事情是

    form=SOME_MODEL_FORM(...., instance=cafe)
    print cafe.name # "CAFE OLD NAME"
    if request.method="POST":
        if form.is_valid():
            ### HERE the cafe instance has been changed
            print cafe.name # "CAFE NEW NAME"

我使用post_save进行调试,is_valid确实保存了模型!

我目前的解决方法是在调用is_valid之前将模型保存在另一个对象中,然后保存以覆盖chang。这真的是黑客攻击,我希望有一种更优雅的方式来实现相同的目标(在is_valid调用之后不保存模型)。

谢谢!

2 个答案:

答案 0 :(得分:10)

form.is_valid()不会将新数据保存在数据库中。但是,它使用新属性更新实例对象,以便在调用form.save()时可以使用它们。

以下是验证此方法的方法:

>>> mc = MyModel.objects.get(id=3)
>>> mf=MyModelForm({'name': 'abcd'}, instance=mc)
>>> mc.name
u'oldName'
>>> mf.is_valid()
True
>>> mc.name
u'abcd'
>>> mc2 = MyModel.objects.get(id=3)  #get the new instance from DB
>>> mc2.name
u'OldName'
>>> 

答案 1 :(得分:1)

form.is_valid()不保存表单,它只是按名称暗示检查验证。

https://docs.djangoproject.com/en/dev/ref/forms/api/#django.forms.Form.is_valid

在此处阅读modelform中的is_valid方法 https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#the-is-valid-method-and-errors