widgets tipos personalizados formularios fields ejemplos avanzados django django-forms

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