¿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.

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".


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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.