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
Sólo añadiendo a Reiner Gerecke.
Cuando se llama al método is_valid () en el formulario, el método MultiEmailField.clean () se ejecutará como parte del proceso de limpieza y, a su vez, llamará a los métodos personalizados to_python () y validate (). Solo lea la parte "Limpieza de campo de formulario por defecto" y su ejemplo