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 を呼び出す前にモデルを別のオブジェクトに保存し、次に保存して変更をオーバーライドすることです。それは本当にハッキングであり、同じ目標を達成するためのよりエレガントな方法が必要です (is_valid 呼び出しの後にモデルを保存しないでください)。

ありがとう!

4

2 に答える 2

14

Noform.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 に答える