28

Djangoアプリのフォームとカスタムフィールドにカスタム検証を追加しています。エラーをトリガーするときにフィールドの値を変更できるようにしたいと思います。たとえば、エラーが発生した場合は、clean()で修正されたフィールド値と、「データは以下で修正されました。もう一度[保存]をクリックして、これらの変更に問題がないかどうかを確認してください」というエラーメッセージを表示してフォームを再表示する必要があります。

このようにcleaned_data[]で変更されたデータを返そうとしましたが、機能しません。エラーは正しく表示されますが、フォームが再表示されたときにフィールド値が修正されたHTMLで更新されません。

class T34AtividadeForm(ModelForm):
    def clean(self):
        # Return cleaned html
        error,html = fix_imgs(cleaned_data.get("a34_descricao"))
        if error:
            msg = u'Data has been corrected below. Click save again to confirm if these changes are OK';
            self._errors['a34_descricao'] = ErrorList([msg])
            # This doesn't work
            cleaned_data["a34_descricao"] = html
            # This doesn't work either
            self.a34_descricao = html

    return cleaned_data

フィールドでも同じことをしたいのですが、例外が原因でエラーが発生するため、修正した値を返す機会がありません。form clean()メソッドと同様に、エラーは正しく表示されますが、値は更新されません。

class HTMLField(CharField):
    widget = HTMLTextarea

    def clean(self, value):
        value = super(HTMLField,self).clean(value)
        error,html = fix_imgs(value)
        if error:
            # This doesn't work
            self.value = html
            raise forms.ValidationError(u'Data has been corrected below. Click save again to confirm if these changes are OK.')
        return html
4

7 に答える 7

7

clean メソッドで自己データを変更して、表示される値を変更します

于 2009-03-17T14:11:49.097 に答える
2

clean() で値を更新する方法は、フォームのデータ ディクショナリの値を更新することです。

self.data["a34_stuff"] = "html"

これは確実に機能します。

于 2015-11-24T20:22:21.133 に答える
1

別のクリーン関数で特定のフィールドに値を設定していましたが、メインのクリーン関数によって上書きされたため機能しませんでした。値を設定して保持するには:

  • うまくいきませんでした。
    def clean_tipo_cupon(self):
        tipo_cupon = self.cleaned_data['tipo_cupon']
        qscu = mdlcat.TipoCuponVenta.objects.filter(
            id=tipo_cupon, estado_id=1,
        )
        if not qscu.exists():
            wmessage = u'introducido no paso validación'
            raise forms.ValidationError(wmessage)

        qscu = qscu.first()
        if not qscu.default_owner is None:
            self.cleaned_data['default_owner'] = qscu.default_owner.id

        return tipo_cupon

  • ここでは、それは魅力のように機能しました。
    def clean(self):
        cleaned_data = super().clean()
        for item in self.fields.keys():
            if isinstance(cleaned_data.get(item), str):
                cleaned_data[item] = cleaned_data.get(item).upper()

        # if a default owner is configured by coupon type
        # it will be assigned
        tipo_cupon = cleaned_data['tipo_cupon']
        qscu = mdlcat.TipoCuponVenta.objects.filter(
            id=tipo_cupon, estado_id=1,
        )
        qscu = qscu.first()
        if not qscu.default_owner is None:
            self.cleaned_data['default_owner'] = qscu.default_owner.id

        return cleaned_data
于 2020-03-17T15:11:35.833 に答える
0

これは私が試し、私のために働く方法です:

 inst = my_form.save(commit=False)
 if not inst.a34_stuff: # or incorrect
     inst.data["a34_stuff"] = "corrected"
于 2011-07-21T10:57:44.220 に答える