1

これは、ビューから見た私のコードの断片です。

    if form.is_valid():
        instance = form.save(commit=False)
        try:
            instance.account = request.account
            instance.full_clean()
        except ValidationError, e:
            # Do something with the errors here... I certainly don't want to do this 180 times.

これは完全な混乱です。すべてのビューで検証エラーを手動で処理したい人。後にインスタンスを変更しない場合はsave(commit=False)、これについて心配する必要はありませんが、すべてのモデルに外部キーがあり、その外部キーがaccount舞台裏で設定され、ユーザーから隠されている場合はどうでしょうか。

どんな助けでも本当にありがたいです。

4

2 に答える 2

2

質問のタグが原因formだと思います。ModelForm

ModelFormを呼び出すとモデルの検証が実行is_valid()されるため、を呼び出す前に、検証するモデルインスタンスに必要な舞台裏の変更がすでに含まれていることを確認するだけで十分ですis_valid()

form.instanceを呼び出す前に変更を変更することで、これを行うことができますis_valid()

フォーム自体の中でこれらの種類の変更を行うためのより一般的な解決策は次のとおりです。

class PresetAttrsModelForm(ModelForm):
    def __init__(self, *args, **kwargs):
        preset_attrs = kwargs.pop('preset_attrs', None)
        # Sets up self.instance, among other things
        super(ModelForm, self).__init__(*args, **kwargs)
        if preset_attrs:
            for attr, value in preset_attrs.items():
                setattr(self.instance, attr, value)

class MyModelForm(PresetAttrsModelForm):
    class Meta:
        model = MyModel

form = MyModelForm(preset_attrs={'account': request.account})
于 2010-03-31T10:51:12.807 に答える
1

問題を正しく理解しているかどうかはわかりませんが、フォーム内のデータの検証を「一元化」する場合は、フォームのclean()メソッドを上書きできます。

djangodocs-クリーンメソッドを上書き

フォームで渡されたデータに基づいてオブジェクトのデータを変更するには、form.saveメソッドを上書きします。

SOFディスカッション-上書き保存方法

于 2010-03-31T09:44:48.153 に答える