2008-10-09 6 views
80

Después de que mi valida 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.¿Inyectar errores en un formulario ya validado?

¿Hay alguna forma de insertar 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 hay mejores enfoques alternativos)?

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

Respuesta

84

Form._errors se puede tratar como un diccionario estándar. Se considera buena forma de utilizar la clase ErrorList, y para anexar errores a la lista existente:

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

Y si desea agregar errores no de campo, utilice django.forms.forms.NON_FIELD_ERRORS (por defecto "__all__") en lugar de "myfield".

+0

Para que coincida con lo que Django haciendo, debe insertar objetos ErrorList. –

+1

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 manera estándar de hacer esto en Django? Estoy en una situación similar a la OP: tengo un formulario donde los usuarios proporcionan un nuevo nombre que debe ser único en la base de datos. Si hay una colisión, me gustaría enviar el formulario con un error, pero no lo sabré hasta que intente hacer la inserción de 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, corregido. @Weeble: '_errors' es parte de la API de forma pública, a pesar de su nombre; vea la respuesta de insin para un enlace de documentos. –

14
+5

Y al parecer en la versión 1.6 posterior desarrollo, que están construyendo un 'add_error' función: https://docs.djangoproject.com/en/dev/ref/forms/api/#django .forms.Form.add_error – brianmearns

+0

Y ahora Django 1.7 tiene una función oficial add_error: https://docs.djangoproject.com/en/1.7/ref/forms/api/#django.forms.Form.add_error –

Cuestiones relacionadas