2011-12-22 10 views
8

Ho un modulo con diversi campi. Ho controlli di convalida separati per ogni campo, fatti tramite la convalida dei moduli. Tuttavia, devo anche controllare se alcuni campi sono stati compilati prima di reindirizzare l'utente a una vista diversa. Speravo di poter in qualche modo aggiungere l'errore a forms.non_field_errors perché non è per un campo particolare, ma non sono sicuro di quale sarebbe la sintassi giusta per questo. Ho controllato on-line e ho trovato ..Come aggiungere un messaggio di errore a form.non_field_errors in django?

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

Questo visualizza il messaggio di errore, ma sembra rovinare le altre pagine come bene e displyas il messaggio di errore se clicco su qualsiasi altra cosa.

ho cercato

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

Questo provoca un oggetto 'NoneType' ha nessun errore attributo 'setDefault' per me.

ho cercato

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

Questo non sembra di fare nulla e non posso vedere il messaggio di errore sulla vista.

Quale sarebbe il modo migliore per farlo? Idealmente, non voglio farlo nel metodo pulito della forma. Sento che dovrei essere in grado di aggiungere un errore al modulo nella vista.

risposta

17
  1. chiamata full_clean(), questo dovrebbe inizializzare form._errors. Questo passaggio è fondamentale, se non lo fai, non funzionerà.

  2. fare la lista degli errori, ci vuole un elenco di messaggi, è instanciate come tale: error_list = form.error_class(['your error messages'])

  3. assegnare la lista degli errori di NON_FIELD_ERRORS, è necessario importare NON_FIELD_ERRORS da django.forms.forms, quindi assegnare come quali: form._errors[NON_FIELD_ERRORS] = error_list

Ecco una dimostrazione da una 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

So che posso farlo nel metodo Form.clean().Comunque preferirei farlo nella vista e aggiungere semplicemente un errore alla lista form.errors, è possibile? – Angela

+0

Ebbene sì, è possibile che la mia risposta lo provi :) – jpic

+0

Grazie a jpic per la tua risposta dettagliata. Proverò questo codice e tornerò. Scusa per la risposta in ritardo, sono stato via in vacanza. – Angela

4

Questo è un po 'obsoleto, ma di recente ho incontrato la stessa domanda e volevo gettare qualche ulteriore luce su questo per i futuri lettori.

  1. partire dal Django 1.6+ dizionario errori viene memorizzato come form.errors e non form._errors
  2. Se si crea un'istanza di form.is_valid(), è l'equivalente di correre full_clean()
  3. NON_FIELD_ERRORS non è necessario importare, si può semplicemente fare riferimento alla sua chiave di dizionario predefinito di __all__

Esempio:

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

Bene in generale è meglio usare costanti definite, es. 'NON_FIELD_ERRORS' sul suo valore' __all__'. Inoltre, per quanto ho capito, il punto di impostazione degli errori non di campo ** prima ** chiamando 'is_valid()' è in grado di influenzare realmente il risultato di 'is_valid()'. – jpic

+0

Sono d'accordo con la parte costante NON_FIELD_ERRORS, volevo solo indicare un'alternativa. Come per l'impostazione degli errori non di campo, quello che stavo cercando di dire è che gli errori di campo non vengono istanziati a meno che is_valid() o full_clean() non venga chiamato affatto. Se provi l'accesso prima di eseguire entrambi i metodi otterrai un KeyError. A meno che quello che stavi cercando di dire è che si dovrebbe eseguire full_clean() prima di eseguire is_valid()? – asaji

+0

Questo è pieno di disinformazione: form.errors è una proprietà che accede alla lista interna form._errors. Ed è una buona pratica usare NON_FIELD_ERRORS come costante dato che un giorno gli sviluppatori potrebbero decidere improvvisamente che la costante dovrebbe essere equivalente alla stringa "_la_le_loo_". Ecco perché abbiamo costanti nelle lingue, quindi possiamo astrarre e mantenere più facilmente il nostro codice. Inoltre, form.is_valid() non è l'equivalente di eseguire full_clean(). is_valid() chiama form.errors, che chiama full_clean per popolare il dizionario _errors. – Bobort

0

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

Problemi correlati