2010-02-21 13 views
12

Sono nuovo di Django (e Python) e sto cercando di capire come condizionare certi aspetti della convalida del modulo. In questo caso, c'è un'interfaccia HTML per l'applicazione in cui l'utente può scegliere una data e un'ora dai widget. Il metodo clean sull'oggetto modulo accetta i valori dei campi data e ora e li trasforma in un datetime.Convalida del modulo Django: rendere condizionale la parola "richiesto"?

In aggiunta alla interfaccia HTML, c'è anche un client iPhone effettuare chiamate nell'applicazione, e mi piacerebbe passare un valore di tempo timestamp di tipo UNIX in

Il mio codice forma simile a questa:.

class FooForm(forms.ModelForm): 
    foo_date    = forms.CharField(required=True, widget=forms.RadioSelect(choices=DATE_CHOICES)) 
    foo_time    = forms.CharField(required=True, widget=SelectTimeWidget()) 
    foo_timestamp  = forms.CharField(required=False) 

Come faccio foo_date e foo_time richiesto menofoo_timestamp è previsto?

risposta

21

Questo viene eseguito con il metodo clean nel modulo. È necessario impostare foo_date e foo_time su required=False, tuttavia, poiché clean viene chiamato solo dopo che ogni campo è stato convalidato (vedere anche documentation).

+0

Grazie, stavo pensando che "clean" fosse probabilmente il posto giusto per farlo. È possibile, tuttavia, avere l'errore di validazione nei campi 'foo_date' e' foo_time', rispetto a un errore di validazione generale del modulo? Grazie, Chris – ChrisW

+1

Questo è spiegato nel secondo esempio nella documentazione che ho collegato a –

+0

self.RTFM; grazie, scaverò dentro – ChrisW

8

Mi sono trovato a dover un modo "standard" per farlo, poiché le mie forme hanno diversi campi richiesti condizionatamente. Così ho creato una superclasse con il seguente metodo:

def validate_required_field(self, cleaned_data, field_name, message="This field is required"): 
    if(field_name in cleaned_data and cleaned_data[field_name] is None): 
     self._errors[field_name] = self.error_class([message]) 
     del cleaned_data[field_name] 

E poi nel metodo pulito di mia forma ho:

def clean(self): 
    cleaned_data = super(FormClass, self).clean() 
    if(condition): 
     self.validate_required_field(cleaned_data, 'field_name') 

Ha funzionato perfettamente per me finora.

Problemi correlati