2011-12-22 20 views
8

Tengo un formulario con varios campos. Tengo comprobaciones de validación separadas para cada campo, realizadas a través de la validación de formularios. Sin embargo, también necesito verificar si se rellenan algunos campos antes de redirigir al usuario a una vista diferente. Esperaba poder adjuntar de alguna manera el error a forms.non_field_errors ya que no es para un campo en particular, pero no estoy seguro de cuál sería la sintaxis correcta para esto. He comprobado en línea y se encontró ..¿Cómo adjuntar el mensaje de error a form.non_field_errors en django?

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

Esto muestra el mensaje de error, pero parece echar a perder las otras páginas, así y displyas el mensaje de error si hago clic en cualquier otra cosa.

me trataron

form._errors[NON_FIELD_ERRORS] = form.error_class() 

Esto hace que un objeto 'NoneType' no tiene atributo de error 'setdefault' para mí.

He tratado

form.non_field_errors().append("Please complete your profile in order to access the content.") 

Esto no parece hacer nada y no puedo ver el mensaje de error en la vista.

¿Cuál sería la mejor manera de hacerlo? Lo ideal es que no quiera hacerlo en el método limpio de la forma. Siento que debería poder adjuntar un error al formulario en la vista.

Respuesta

17
  1. llamada full_clean(), esto debe inicializar form._errors. Este paso es crítico, si no lo haces, no funcionará.

  2. Hacer la lista de errores, se necesita una lista de mensajes, instanciate como tal: error_list = form.error_class(['your error messages'])

  3. asignar la lista de errores a NON_FIELD_ERRORS, usted tiene que importar NON_FIELD_ERRORS de django.forms.forms, a continuación, asignar como tales: form._errors[NON_FIELD_ERRORS] = error_list

Aquí es una demostración de un shell:

In [1]: from bet.forms import BetForm 

In [2]: from django.forms.forms import NON_FIELD_ERRORS 

In [3]: form = BetForm() 

In [4]: form.full_clean() 

In [5]: form._errors[NON_FIELD_ERRORS] = form.error_class(['your error messages']) 

In [6]: form.non_field_errors() 
Out[6]: [u'your error messages'] 
+0

Sé que puedo hacerlo en el método Form.clean().Sin embargo, preferiría hacerlo en la vista y anexar un error a la lista form.errors, ¿es esto posible? – Angela

+0

Bueno, sí, es posible que mi respuesta lo demuestre :) – jpic

+0

Gracias jpic por su respuesta detallada. Voy a probar este código y volveré. Perdón por la respuesta tardía. He estado de vacaciones. – Angela

4

Esto es un poco obsoleto, pero recientemente me encontré con la misma pregunta y quería arrojar más luz sobre esto para los lectores en el futuro.

  1. A partir de Django 1.6 + el diccionario errores se almacena como form.errors y no form._errors
  2. Si usted instancia form.is_valid(), que es el equivalente a correr full_clean()
  3. NON_FIELD_ERRORS no es necesario importar, puede referirse simplemente a su clave de diccionario por defecto de __all__

Ejemplo:

if form.is_valid(): 
    form.errors['__all__'] = form.error_class(['Your Error Here!']) 
+3

Bueno, en general, es mejor usar constantes definidas, es decir. 'NON_FIELD_ERRORS' sobre su valor' __all__'. Además, por lo que yo entiendo, el punto de establecer errores no de campo ** antes de ** llamar a 'is_valid()' es poder influir realmente en el resultado de 'is_valid()'. – jpic

+0

Estoy de acuerdo con la parte constante NON_FIELD_ERRORS, solo quería señalar una alternativa. En cuanto a la configuración de errores no de campo, lo que estaba tratando de decir es que los errores no de campo no se instancian a menos que se invoque is_valid() o full_clean(). Si intenta acceder antes de ejecutar cualquiera de los métodos, obtendrá un KeyError. A menos que lo que intentas decir es que uno debe ejecutar full_clean() antes de ejecutar is_valid()? – asaji

+0

Esto está lleno de desinformación: form.errors es una propiedad que accede a la lista interna form._errors. Y es una buena práctica usar NON_FIELD_ERRORS como una constante ya que los desarrolladores algún día pueden decidir de repente que la constante sea equivalente a la cadena "_la_le_loo_". Es por eso que tenemos constantes en los idiomas, por lo que podemos abstraer y mantener nuestro código más fácilmente. Además, form.is_valid() no es el equivalente de ejecutar full_clean(). is_valid() llama a form.errors, que llama a full_clean para llenar el diccionario _errors. – Bobort

0

self._errors.setdefault('__all__', ErrorList()).extend([""])

Cuestiones relacionadas