9

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

谢谢!

4

2 回答 2

14

form.is_valid()不会将新数据保存在 DB 中。但是,它会使用新属性更新实例对象,以便在您调用时可以使用它们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'
>>> 
于 2012-09-07T04:11:20.490 回答
2

form.is_valid() 不保存表单,它只是检查验证,顾名思义。

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

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

于 2012-09-07T02:57:16.567 回答