¿Inyectar errores en un formulario ya validado?

97

Después de form.Formvalidar los valores de entrada del usuario, los paso a un proceso separado (externo) para su posterior procesamiento. Este proceso externo puede potencialmente encontrar más errores en los valores.

¿Hay alguna manera de inyectar estos errores en el formulario ya validado para que se puedan mostrar a través de los métodos habituales de visualización de errores de formulario (o existen mejores enfoques alternativos)?

Una sugerencia fue incluir el procesamiento externo en la validación del formulario, lo cual no es ideal porque el proceso externo hace mucho más que simplemente validar.

Parand
fuente

Respuestas:

92

Form._errorspuede tratarse como un diccionario estándar. Se considera una buena forma usar la ErrorListclase y agregar errores a la lista existente:

from django.forms.utils import ErrorList
errors = form._errors.setdefault("myfield", ErrorList())
errors.append(u"My error here")

Y si desea agregar errores que no sean de campo, use django.forms.forms.NON_FIELD_ERRORS(predeterminado en "__all__") en lugar de "myfield".

John Millikin
fuente
2
Esto parece un poco desagradable, ya que el nombre "_errors" sugiere que se supone que es interno a la clase de formulario. ¿Es esa la forma estándar de hacer esto en Django? Estoy en una situación similar a la del OP: tengo un formulario en el que los usuarios proporcionan un nuevo nombre que debe ser único en la base de datos. Si hay una colisión, me gustaría devolver el formulario con un error, pero no lo sabré hasta que realmente intente insertar la base de datos. (En teoría, el validador podría verificar la base de datos, pero eso huele y es propenso a las carreras.)
Weeble
1
@scompt: gracias, arreglado. @Weeble: _errorses parte de la API de formulario público, a pesar de su nombre; vea la respuesta de insin para un enlace de documentos.
John Millikin
18
Esto es increíblemente no pitónico. ¿Qué tan difícil fue implementar form.errors ['myfield']. Append (my_error) o form.add_error ('myfield', my_error)? Demasiado espacio para el error (sin juego de palabras) en la implementación actual.
Michael
2
Mayormente completo. Una nota adicional es que si no se llamó a is_valid (), entonces deberá configurar form._errors = ErrorDict ()
jacob
12
@Michael - parece que siguieron su consejo ... Django Dev - Form.add_error (campo, error)
Clayton
14

Puede agregar detalles de error adicionales al _errorsatributo del formulario directamente:

https://docs.djangoproject.com/en/1.5/ref/forms/validation/#descriptions-later https://docs.djangoproject.com/en/1.6/ref/forms/validation/#modifying-field-errors

Jonny Buchanan
fuente
6
Y aparentemente en la versión de desarrollo posterior a 1.6, están agregando una add_errorfunción: docs.djangoproject.com/en/dev/ref/forms/api/…
brianmearns
Y ahora Django 1.7 tiene una función oficial add_error: docs.djangoproject.com/en/1.7/ref/forms/api/…
Danilo Cabello
0

Agregar error a un campo específico:

form.add_error('fieldName', 'error description')

** Agregar error a no campos **

form.add_error(None, 'error description')
#Only pass None instead of field name
Muhammad Faizan Fareed
fuente