2010-02-21 13 views
12

Ich bin neu bei Django (und Python) und versuche herauszufinden, wie bestimmte Aspekte der Formularvalidierung konditioniert werden können. In diesem Fall gibt es eine HTML-Schnittstelle für die Anwendung, in der der Benutzer ein Datum und eine Uhrzeit aus Widgets auswählen kann. Die Methode clean für das Formularobjekt übernimmt die Werte der Felder für Uhrzeit und Datum und wandelt sie in eine datetime um.Django Formularvalidierung: macht "erforderlich" bedingt?

Neben der HTML-Schnittstelle, gibt es auch ein iPhone-Client Anrufe in die Anwendung zu machen, und ich möchte einen Wert Timestamp-style Zeit UNIX passieren in

Meine Form Code wie folgt aussieht:.

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) 

Wie mache ich foo_date und foo_time erforderlich es sei dennfoo_timestamp zur Verfügung gestellt?

Antwort

21

Dies geschieht mit der clean Methode auf dem Formular. Sie müssen foo_date und foo_time jedoch auf required=False setzen, da clean nur aufgerufen wird, nachdem jedes Feld validiert wurde (siehe auch documentation).

+0

Danke, ich dachte "sauber" war wahrscheinlich der richtige Ort dafür. Ist es jedoch möglich, dass der Validierungsfehler für die Felder "foo_date" und "foo_time" im Vergleich zu einem allgemeinen Formularüberprüfungsfehler auftritt? Danke, Chris – ChrisW

+1

Das wird im zweiten Beispiel in der Dokumentation erläutert, die ich mit –

+0

selb.RTFM verknüpft habe; Danke, ich werde graben. – ChrisW

8

Ich fand mich eine "Standard" Möglichkeit, dies zu tun, da meine Formulare mehrere bedingt erforderliche Felder haben. Also habe ich eine übergeordnete Klasse mit dem folgenden Verfahren:

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] 

Und dann in meiner Form saubere Methode, die ich habe:

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

Es war für mich perfekt so weit.