2009-03-17 11 views
18

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 

Respuesta

6

datos de cambio de aspecto en el método limpio para cambiar el valor que obtiene representada

+6

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

+1

Sí, pero no hay una forma oficial de hacerlo. – user51463

+3

@ user27478: ¿Puedes publicar tu solución? – Don

-1

Si su forma es formar un modelo de un mejor enfoque sería la de 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 funcionará realmente ... No estoy seguro de si la forma cambiará.

+0

¡No funciona! – digz6666

0

Esta es la forma en que he probado y funciona para mí:

inst = my_form.save(commit=False) 
if not inst.a34_stuff: # or incorrect 
    inst.data["a34_stuff"] = "corrected" 
+1

¡Si hay algún error de validación, no funciona! – digz6666

3

manera de actualizar el valor de limpia() es la actualización del valor en el diccionario de datos del formulario:

self.data["a34_stuff"] = "html" 

Estos trabajos sin lugar a duda.

+1

Esto no funciona con Django 2.0 – Daniel

+0

¡tampoco en 1.11! –

Cuestiones relacionadas