我发现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调用之后不保存模型)。
谢谢!
答案 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