2010-01-31 17 views
16

Ho un formset inline per un modello, che ha un vincolo unique_together. E così, quando i dati di input, che non rispetta questo vincolo, visualizza:Django: visualizzazione errori formset corretti

__all__Please correct the duplicate values below.

Il codice, che fa questo è:

{% for error in formset.errors %} 
     {{ error }}<br/> 
    {% endfor %} 

io non faccio molto come il __all__ all'inizio dell'errore ed è abbastanza chiaramente la chiave del dizionario, così ho provato:

{% for key, error in formset.errors %} 
     {{ key }}: {{ error }}<br/> 
    {% endfor %} 

Ma poi tutto quello che ottiene è:

__all__:

{{error}} non visualizzerà affatto. Allora, cosa sta succedendo qui? E come faccio a visualizzare correttamente l'errore?

risposta

24

Penso che il problema qui sia che formset.errors è un elenco di dizionari, non un singolo dizionario.

Dal Django docs page on formsets:

>>> formset.errors 
[{}, {'pub_date': [u'This field is required.']}] 

vedere se qualcosa di simile questo risolve il problema: (aggiornamento sulla base dei commenti askers)

{% for dict in formset.errors %} 
    {% for error in dict.values %} 
     {{ error }} 
    {% endfor %} 
{% endfor %} 

Se non funziona, mi piacerebbe provare con manage.py shell e prova a riprodurre la tua situazione nella shell python ... in questo modo sarà facile ispezionare i vari valori e capire cosa devi fare.

+0

Grazie :) disponibile. La tua strada non ha funzionato, ma alla fine ho funzionato con una piccola modifica (errori.valori anziché errori), quindi ora si presenta così: {% per dict in formset.errors%} {% per errore in dict.values%} {{error}} {% endfor%} {% endfor%} –

+0

Contento di aver potuto aiutare. Ho aggiornato la mia risposta in base ai tuoi commenti. Sembra che il problema chiave che prima lo aveva messo in disordine era che 'formset.errors' fosse una lista di dict, non un singolo dict. –

+0

Per la versione corrente di Django, il looping degli errori nei template non è generalmente quello che vuoi. Dal momento che l'OP ha chiesto alla fine "... come faccio a visualizzare correttamente l'errore?", Vorrei fare riferimento alle altre risposte che non coinvolgono gli errori di loopoverover. – dsalaj

5

La cicli for sono inutili, questi errori devono essere visualizzati correttamente con il seguente:

{{ formset.non_form_errors }} 
2

Django 1.6 formsets hanno un nuovo metodo, BaseFormSet.total_error_count. L'utilizzo di questo in un modello condizionale garantisce che vengano emessi solo errori e markup se esiste almeno un errore nel formset.

{% if formset.total_error_count %} 
    <ul class="errorList"> 
    {% for dict in formset.errors %} 
     {% for error in dict.values %} 
     <li>{{ error }}</li> 
     {% endfor %} 
    {% endfor %} 
    </ul> 
{% endif %} 

Vedere Django docs page per v1.6 +.

0

Ecco un chiarimento per chiunque incontrare problemi simili di errori non essere reso in modello:

Se si dispone ed errori per quanto riguarda il formset nel suo complesso, l'uso:

{{ formset.non_form_errors }} 

questo restituisce fondamentalmente errori in __all__ voce da formset.errors.È documentato come:

""" 
    Returns an ErrorList of errors that aren't associated with a particular 
    form -- i.e., from formset.clean(). Returns an empty ErrorList if there 
    are none. 
    """ 

Tuttavia, se si sta eseguendo il rendering forme da formset e alcuni errori non stai comportando renderd, probabilmente si sta perdendo:

{% for form in formset.forms %} 
    {# ... #} 
    {{ form.non_field_errors }} 
{% endfor %} 

questo restituisce errori in __all__ voce dalla form.errors. Questi sono, analogamente allo non_form_errors, gli errori che non sono associati ad un campo particolare, ma piuttosto alle relazioni di campo. Per esempio se si ha un modulo con campi From e To, e si convalida se From valore è più piccolo To valore, il tag {{ form.non_field_errors }} potrebbe rendere il seguente errore:

'The From value must be smaller than the To value' 
+0

Se si desidera impostare il valore formset.non_form_errors, utilizzare la seguente sintassi 'formset._non_form_errors =" il mio messaggio di errore "' (Notare il carattere di sottolineatura prima di non_form_errors) – Ben

Problemi correlati