2010-11-19 15 views
22

Tengo un formulario de Django con varios campos que estoy representando en la plantilla. También tengo algunos elementos de entrada HTML directos que quiero validar en la vista accediendo a los vars request.POST. Si no validan, quiero insertar un error en el formulario de Django para que pueda mostrarlo en la página. ¿Hay una manera de hacer eso?Django: ¿Agregar non_field_error de la vista?

Respuesta

28

También puede utilizar el método bastante elegante add_error(). Funciona para Django> = 1.7.

Si configura field como None forma tratará el error como "no_campo" uno. Así :

form.add_error(None, "I'm non-field error")

funciona como un encanto.

+1

Para Django> = 1.7 – AliBZ

+1

Gracias. He actualizado mi respuesta. – grafa

6

Bien, puede insertar cualquier cosa en el diccionario errors del formulario, y los errores que no son de campo van en errors['__all__'].

¿Pero por qué mantiene algunos campos fuera del formulario de Django, solo para volver a poner sus errores al final? ¿Por qué no poner todos los campos en el formulario en primer lugar? Si es solo que está usando un modelo y quiere agregarle campos, puede hacerlo en Django simplemente declarando los campos en el nivel del formulario, luego puede definir métodos limpios para ellos dentro del formulario.

class ExtendedModelForm(forms.ModelForm): 
    extra_field_1 = forms.CharField() 
    extra_field_2 = forms.CharField() 

    def clean_extra_field_1(self): 
     ...etc... 
+0

Consulte mi otra pregunta para razonar: http://stackoverflow.com/questions/4228722/django-checkboxselectmultiple El campo requiere mucha personalización que es un poco difícil de tener en el formulario. – mpen

+1

@Mark simplemente porque desea personalizar la pantalla, no significa que no puede incluir el campo en el formulario con fines de validación y visualización de errores. –

+1

Derecha ... si lo nombre correctamente, Django no sabrá la diferencia ¿eh? – mpen

21

Agregando a la respuesta de Daniel, la sintaxis específica es:

form.errors['__all__'] = form.error_class(["error msg"]) 

Tenga en cuenta que se puede sustituir '__all__' con la constante NON_FIELD_ERRORS para una mejor compatibilidad (crédito grafa).

from django.forms.forms import NON_FIELD_ERRORS 
Cuestiones relacionadas