Iniettare errori in un modulo già convalidato?


97

Dopo aver form.Formconvalidato i valori di input dell'utente, li passo a un processo separato (esterno) per un'ulteriore elaborazione. Questo processo esterno può potenzialmente trovare ulteriori errori nei valori.

C'è un modo per inserire questi errori nel modulo già convalidato in modo che possano essere visualizzati tramite i normali metodi di visualizzazione degli errori del modulo (o esistono approcci alternativi migliori)?

Un suggerimento era di includere l'elaborazione esterna nella convalida del modulo, il che non è l'ideale perché il processo esterno fa molto di più che semplicemente convalidare.

Risposte:


92

Form._errorspuò essere trattato come un dizionario standard. È considerato una buona forma usare la ErrorListclasse e aggiungere errori all'elenco esistente:

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

E se vuoi aggiungere errori non di campo, usa django.forms.forms.NON_FIELD_ERRORS(il valore predefinito è "__all__") invece di "myfield".


2
Questo sembra un po 'spiacevole, poiché il nome "_errors" suggerisce che dovrebbe essere interno alla classe del form. È questo il modo standard per farlo in Django? Mi trovo in una situazione simile all'OP: ho un modulo in cui gli utenti forniscono un nuovo nome che deve essere univoco nel database. Se c'è una collisione, vorrei rispedire il modulo con un errore, ma non lo saprò fino a quando non provo a eseguire l'inserimento del database. (In teoria il validatore potrebbe controllare il database, ma questo puzza ed è incline alle gare.)
Weeble

1
@scompt: grazie, risolto. @Weeble: _errorsfa parte dell'API del modulo pubblico, nonostante il nome; vedere la risposta di insin per un collegamento ai documenti.
John Millikin

18
Questo è incredibilmente non pitonico. Quanto è stato difficile implementare form.errors ['myfield']. Append (my_error) o form.add_error ('myfield', my_error)? Troppo spazio per errori (nessun gioco di parole) nell'attuale implementazione.
Michael

2
Per lo più completo. Una nota in più è che se is_valid () non è stato chiamato, allora dovrai impostare form._errors = ErrorDict ()
jacob

12
@Michael - sembra che abbiano seguito il tuo consiglio ... Django Dev - Form.add_error (field, error)
Clayton


14

6
E a quanto pare nella versione di sviluppo post 1.6, stanno aggiungendo una add_errorfunzione: docs.djangoproject.com/en/dev/ref/forms/api/…
brianmearns

E ora Django 1.7 ha una funzione add_error ufficiale: docs.djangoproject.com/en/1.7/ref/forms/api/…
Danilo Cabello

0

Aggiungi errore al campo specifico:

form.add_error('fieldName', 'error description')

** Aggiungi errore a non campi **

form.add_error(None, 'error description')
#Only pass None instead of field name
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.