validate formularios form fields errors django validation django-forms

formularios - django-cómo procesar/limpiar un campo antes de la validación



validate email django (3)

Como extra, cuando is_valid() devuelve False , puede verificar por qué, imprimiendo self.errors dentro del formulario.

Si observa el código is_valid() , esto verifica el formulario is_bound y el self.errors está vacío.

Tengo un formulario que debe validarse solo después de que se haya limpiado.

¿Qué sucede cuando ejecutas form.is_valid() ? ¿Se limpia el formulario y luego se valida esa versión limpia del formulario?

El comportamiento que estoy teniendo en este momento, es que si mi campo no pasa la validación antes de limpiar, incluso si la limpieza lo haría pasar, is_valid() devuelve False .

¿Estoy haciendo algo mal?

Código:

# View class ContactForm(forms.Form): message = forms.CharField(widget=forms.Textarea, max_length=5) def clean_message(self): message = self.cleaned_data[''message''] return message.replace(''a'', '''') # remove all "a"s from message def contact(request): if request.method == ''POST'': if form.is_valid(): return HttpResponseRedirect(''/contact/on_success/'') else: return HttpResponseRedirect(''/contact/on_failure/'')

Quiero que form.is_valid() devuelva True si el mensaje tiene menos de 5 caracteres sin incluir a !

¿Es posible ejecutar clean_<fieldname>() después de to_python() pero antes de run_validators() ? ¿O debería estar haciendo esto de otra manera?


Creo que el proceso de validación de formularios (y su orden correcto) está realmente bien documentado. http://docs.djangoproject.com/en/dev/ref/forms/validation/#form-and-field-validation

¿Te importaría compartir tu código? Hay un método clean en cada campo de formulario, responsable de ejecutar to_python , validate y run_validators (en este orden). to_python acepta el valor bruto del widget, lo convierte en un tipo python, validate toma el valor coercionado y ejecuta la validación específica del campo.

Respuesta actualizada con respecto al código dado.

Se llama a clean_message después de que todas las demás validaciones se hayan ejecutado como to_python , validate y, lo más importante, run_validators . Creo que el último método comprobará que no se haya violado la restricción max_length . Así que cambiar los datos después no tiene efecto.

La solución es plantear un ValidationError aquí. La eliminación de max_length evitará cualquier validación en la longitud de la entrada.

class ContactForm(forms.Form): message = forms.CharField(widget=forms.Textarea) def clean_message(self): message = self.cleaned_data[''message''] message = message.replace(''a'', '''') # remove all "a"s from message if len(message) >= 5: raise ValidationError(''Too many characters ...'') return message