2011-01-13 9 views
10

En una función de vista, tengo algo como:En Django, ¿cómo puedo obtener un mensaje de excepción?

try: 
    url = request.POST.get('u', '') 
    if len(url) == 0: 
     raise ValidationError('Empty URL') 
except ValidationError, err: 
    print err 

La salida es una cadena: [u'Empty URL']

Cuando trato de pasar el mensaje de error a mi plantilla (de peluche en un diccionario, algo así como { 'error_message': err.value }), la plantilla obtiene el mensaje correctamente (usando {{ error_message }}).

¡El problema es que obtengo exactamente la misma cadena que la anterior, [u'Empty URL'], con [u'...']!

¿Cómo me deshago de eso?

(Python 2.6.5, Django 1.2.4, Xubuntu 10,04)

Respuesta

12

ValidationError tiene varios mensajes de error.

La salida de print err es [u'Empty URL'] porque esa es la cadena devuelta por repr(err.messages) (ver ValidationError.__str__ código fuente).

Si desea imprimir un solo mensaje legible de un ValidationError, puede concatenar la lista de mensajes de error, por ejemplo:

print '; '.join(err.messages) 
+0

Pensé que, como validadores para un campo también es una matriz. Es bueno saber sobre el miembro 'messages' de' ValidationError'. Nunca lo mencionan aquí: https://docs.djangoproject.com/en/dev/ref/forms/validation/ ¡como deberían hacerlo principalmente! –

-2

I fija cambiando ValidationError-BaseException.

+1

Eso es en realidad una mala práctica que diría. BaseException capta todo, mientras que solo debe manejar ValidationError. Si aparece otra excepción, es porque hay un error en su código, que debería corregirse. – Fred

+0

Bueno, yo mismo planteé el error/excepción. El código en el bloque 'try' era _muy_ mínimo, que pensé que las posibilidades de que apareciera un tipo diferente de error eran escasas. Solo quería reutilizar 'ValidationError' para fines semánticos. Supongo que el enfoque más apropiado sería subclasificar 'BaseException' con mi propio tipo de error de validación. En cualquier caso, el código ha cambiado mucho desde que lo publiqué por primera vez y mi solución ya no es aplicable, así que acepté la respuesta anterior. –

Cuestiones relacionadas