Dodaję niestandardową weryfikację do moich formularzy i pól niestandardowych w mojej aplikacji Django. Chciałbym móc modyfikować wartość pola przy wyzwalaniu błędu. Na przykład, jeśli wystąpił błąd, formularz powinien zostać wyświetlony ponownie z wartością pola poprawioną przez clean() i komunikatem o błędzie "Dane zostały poprawione poniżej." Kliknij Zapisz ponownie, aby potwierdzić, czy zmiany są prawidłowe "Modyfikuj wartość pola formularza Django podczas czyszczenia()
I Próbowałem przywrócić zmodyfikowane dane w clean_data [] w ten sposób, ale to nie działa. Poprawnie wyświetla błąd, ale wartość pola nie jest aktualizowana poprawionym kodem HTML, gdy formularz jest wyświetlany ponownie.
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
Chciałbym też zrobić to samo z pola, ale ponieważ błędy są wywoływane przez wyjątku, nie dostanę szansę na powrót skorygowaną wartość. Podobnie jak w przypadku metody clean(), błąd jest wyświetlany poprawnie, ale wartość nie jest aktualizowana.
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
To działa, ale jest nieudokumentowane i brzydko jest modyfikować obiekt QueryDict bezpośrednio. Dodatkowo musiałem napisać funkcję pomocnika, aby zmodyfikować tylko do odczytu QueryDict ... – user27478
Tak, ale nie ma oficjalnego sposobu, aby to zrobić. – user51463
@ user27478: Czy możesz zamieścić swoje rozwiązanie? – Don