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