2011-01-13 12 views
10

In una funzione di visualizzazione, ho qualcosa di simile:In Django, come posso ottenere il messaggio di un'eccezione?

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

L'uscita è una stringa: [u'Empty URL']

Quando provo a passare il messaggio di errore per il mio modello (farcite in un dizionario, qualcosa come { 'error_message': err.value }), il modello ottiene correttamente il messaggio (utilizzando {{ error_message }}).

Il problema è che ottengo la stessa stringa come sopra, [u'Empty URL'], con lo [u'...']!

Come faccio a sbarazzarmene?

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

risposta

12

ValidationError contiene effettivamente più messaggi di errore.

L'output di print err è [u'Empty URL'] perché è la stringa restituita da repr(err.messages) (vedere codice sorgente ValidationError.__str__).

Se si desidera stampare un singolo messaggio leggibile da un ValidationError, è possibile concatenare l'elenco dei messaggi di errore, ad esempio:

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

Ho pensato che, come validatori per un campo è anche un array. Buono a sapersi sul membro 'messages' di' ValidationError'. Non lo menzionano mai qui: https://docs.djangoproject.com/en/dev/ref/forms/validation/ come dovrebbero soprattutto! –

-2

ho risolto cambiando ValidationError a BaseException.

+1

che in realtà è una cattiva pratica direi. BaseException cattura tutto, mentre dovresti gestire solo ValidationError. Se si apre un'altra eccezione, c'è un errore nel codice, che dovrebbe essere corretto. – Fred

+0

Bene, ho sollevato l'errore/eccezione me stesso. Il codice nel blocco 'try' era _molto_piccolo, che pensavo che le possibilità di un diverso tipo di errore spuntare fossero ridotte. Volevo solo riutilizzare 'ValidationError' per scopi semantici. Immagino che l'approccio più appropriato sarebbe quello di sottoclasse di 'BaseException' con il mio tipo di errore di validazione? In ogni caso, il codice è cambiato molto da quando ho postato questo messaggio e la mia soluzione alternativa non è più applicabile, quindi ho accettato la risposta sopra invece. –

Problemi correlati