2010-02-04 10 views

risposta

6

Questo può essere fatto completamente attraverso il modello.

a costruire il modello di modulo per ogni campo modulo che si desidera eseguire il test è possibile utilizzare il seguente esempio costruire

<input type="text" class="reg-txt{% if form.fieldname.errors %} errors{% endif %}"/> 

Questo consente di fornire l'interfaccia che si desidera senza modificare il codice del modulo Django vista &.

+5

C'è qualcosa che può essere fatto in forma o widget di livello? Questo sembra piuttosto prolisso, vorrei avere questa classe di errore su ogni campo di input non valido, textarea, selezionare ... –

26

Ora è facile - nuova funzionalità di Django 1.2

basta aggiungere un attributo alla classe form & sei a posto. Questa caratteristica è menzionato nei documenti sotto una "nuova in 1.2" nota, ma è possibile trovare la magia a django.forms.forms.BoundField.css_classes Ecco il API reference, e un esempio:

class MyForm(forms.Form): 
    required_css_class = "required" 
    error_css_class = "error" 
+1

Sono in esecuzione 1.3 e nessuna di queste classi è mai nell'output del template. Sto rendendo il campo con il semplice {{field}} in un ciclo for. Qualcosa di speciale che devo fare per farlo funzionare? Funziona solo durante l'output di tabelle? – Justin

+4

È necessario stampare l'intero modulo utilizzando {{modulo}}, se lo fai in questo modo vedrai le classi in qualsiasi formato (p, tabella ed elenco). –

+0

@BrianFisher in base alla risposta significa accettare {{modulo}} per ottenere l'errore desiderato/classe richiesta o creare i propri elementi se si desidera un controllo più preciso sull'intero modulo e le classi su errore? – Chris

26

Se volete inserire il vostro errore di classe CSS per formare widgets di ingresso (non i loro contenitori), è possibile derivare la classe modulo dal seguente:

class StyledErrorForm(forms.Form): 
    def is_valid(self): 
     ret = forms.Form.is_valid(self) 
     for f in self.errors: 
      self.fields[f].widget.attrs.update({'class': self.fields[f].widget.attrs.get('class', '') + ' error'}) 
     return ret 
+3

Attenzione per un piccolo trucco, però: questo sostituisce qualsiasi classe che è stata specificata nella dichiarazione del widget di campo (ad esempio 'attrs'). Per aggiungere semplicemente la classe di errore, usa questa riga (leggermente orribile): 'self.fields [f] .widget.attrs.update ({'class': self.fields [f] .widget.attrs.get ('class' , '') + 'errore'}) ' – gregoltsov

+0

Grazie Gregory, ho corretto il mio codice. – Luca

1

utilizzando un modello personalizzato ...

Personalmente mai avuto molta fortuna con il costruito nel Django soluzioni di errore classificare , e inoltre , Mi piace usare il filtro di template 'striptags' incorporato sugli errori, per sbarazzarmi di tutte le cose dell'elenco html che non riesco a capire come renderizzare bene comunque.

Io uso il seguente modello personalizzato per classificarli come "error_id".

@register.filter(is_safe=True) 
@stringfilter 
def error_id(value): 
    if value=='': 
     return '' 
    else: 
     return r'<span class="error_id">'+value+'</span>' 

Render i singoli errori nel vostro modello utilizzando:

{{ form.my_field.errors|striptags|error_id}} 

o rendere l'intero modulo utilizzando qualcosa di simile:

<table border="1" cellpadding="5px" align="center"> 
     {% for field in form.visible_fields %} 
      <tr> 
         <td> {{ field.label_tag }}: </td> 
         <td> {{ field }} </td> 
         <td> {{ field.errors|striptags|error_id }} </td> 
      </tr> 

     {% endfor %} 

    </table> 
+1

Io uso '{{field.errors.join:" "}}' per visualizzare gli errori inline invece di 'ul'. E niente contenuti HTML. – Altaisoft

+1

Puoi chiamare striptags dal tuo filtro da django.template.defaultfilters.stiptags – pymarco

+0

cool grazie per questi buoni consigli – Ninga