Estoy agregando una validación personalizada a mis formularios y campos personalizados en mi aplicación Django. Me gustaría poder modificar el valor de un campo al activar un error. Por ejemplo, si hay un error, el formulario debe volver a mostrarse con el valor de campo corregido por clean() y un mensaje de error "Los datos se corrigieron a continuación. Haga clic en guardar de nuevo para confirmar si estos cambios son correctos"Modificar el valor de un campo de formulario de Django durante la limpieza()
I He intentado devolver los datos modificados en la versión limpiada [] de esta manera, pero no funciona. Muestra el error correctamente, pero el valor del campo no se actualiza con el código HTML corregido cuando se vuelve a mostrar el formulario.
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
También me gustaría hacer lo mismo con un campo, pero dado que los errores son provocados por excepción, no tengo la oportunidad de volver el valor corregido. Al igual que el método de limpieza de formulario(), el error se muestra correctamente, pero el valor no se actualiza.
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
Esto funciona, pero no está documentado y se siente mal modificar directamente el objeto QueryDict. Además, tuve que escribir una función de ayuda para modificar el QueryDict de solo lectura .... – user27478
Sí, pero no hay una forma oficial de hacerlo. – user51463
@ user27478: ¿Puedes publicar tu solución? – Don