tipos - post django
Modificar el valor de un campo de formulario Django durante la limpieza() (5)
Estoy agregando validación personalizada a mis formularios y campos personalizados en mi aplicación Django. Me gustaría poder modificar el valor de un campo cuando se desencadena un error. Por ejemplo, si hay un error, el formulario debe volver a mostrarse con el valor del campo corregido por limpiar () y aparecerá un mensaje de error "Los datos se han corregido a continuación. Haga clic en Guardar para confirmar si estos cambios son correctos"
He intentado devolver los datos modificados en cleaner_data [] de esta manera pero no funciona. Muestra el error correctamente, pero el valor del campo no se actualiza con el 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 como los errores se activan por excepción, no tengo la oportunidad de devolver el valor corregido. Al igual que el método de formulario limpio (), 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
Así lo he intentado y funciona para mí:
inst = my_form.save(commit=False)
if not inst.a34_stuff: # or incorrect
inst.data["a34_stuff"] = "corrected"
Es posible modificar el valor de un campo durante la clean()
si actualiza el atributo self.data
de un formulario. self.data
es una instancia de la clase QueryDict . Por defecto, las consultas son inmutables. Para hacerlos mutables, debes usar el método .copy()
. De la documentación:
Los QueryDicts en request.POST y request.GET serán inmutables cuando se acceda a ellos en un ciclo normal de solicitud / respuesta. Para obtener una versión mutable necesita usar QueryDict.copy ()
self.data = self.data.copy()
self.data[''your_field''] = ''new value''
La forma de actualizar el valor en clean () es actualizar el valor en el diccionario de datos del formulario:
self.data["a34_stuff"] = "html"
Esto funciona seguro.
Si su formulario es un modelo, un mejor enfoque sería obtener una instancia y corregir esos datos en su lugar:
inst = my_form.save(commit=False)
if inst.a34_stuff is None: #or incorrect
inst.a34_stuff = "corrected"
request.user.message_set.create(message = "Error corrected")
return HttpResponseRedirect(reverse(''your_url_name'',
args=[])
PD: No estoy seguro de si esto realmente funcionará ... No estoy seguro de si el formulario recogerá los cambios.
cambiar los datos propios en el método de limpieza para cambiar el valor que se muestra