2010-12-02 9 views
11

Ich habe ein Dropdown-Feld für die Auswahlliste auf meinem Formular, das mit Daten aus einem Modell (Directors) gefüllt ist. Der Wert dieses Dropdown-Menüs muss nicht gespeichert werden. Es wird nur verwendet, um ein anderes Element des Formulars (ein Dropdown-Menü mit dem Titel "Filme") dynamisch auszulösen. Wenn der Benutzer einen Director auswählt, füllt er die zweite Liste dynamisch mit den Filmen, die an diesen Director angehängt sind.Datenüberprüfung für ein Django-Formularelement überschreiben

Das erste Element der ersten Liste ist "Alle Direktoren". Anstatt die Filmliste zu filtern, werden alle Filme in der zweiten Liste angezeigt, weil Alle Regisseure ausgewählt sind.

Wenn der Benutzer einen bestimmten Director und dann einen Film auswählt, wird das Formular ordnungsgemäß übermittelt. Das Problem ist, dass wenn der Benutzer Alle Regisseure auswählt und dann einen Film auswählt, wenn das Formular abgeschickt wird, es mir sagt, dass meine Wahl für die Direktoren ungültig ist, weil es keine der verfügbaren Möglichkeiten ist. In diesem Fall ist eine verfügbare Auswahl (ich nehme an) eines der vorhandenen Director.Objects in der Datenbank. Aber weil mir der Director egal ist, brauche ich diesen Eintrag nicht, um gültig zu sein. Ich brauche nur Film, um gültig zu sein.

Ich verwende ein ModelForm. Wie kann ich die Datenüberprüfung im Director-Formularfeld deaktivieren oder überschreiben, damit der Fehler ignoriert wird, den das Feld generiert?

Antwort

26

Der einfachste Ansatz wäre eine eigene Methode zu definieren, um die Form der Validierung, wie folgt aus:

class MyForm(forms.ModelForm): 
    class Meta: 
     model = WhateverModel 

    def clean(self): 
     super(MyForm, self).clean() #if necessary 
     if self.cleaned_data.get('film') and 'director' in self._errors: 
      del self._errors['director'] 
     return self.cleaned_data        

Siehe http://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other für eine ausführlichere Erklärung und http://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-clean-method für wie sie sich auf ModelForms.

+0

'super (MyForm, self) .clean()' wird die standardmäßige modellbasierte Validierung noch aktiv sein? – andi

+0

Ja. Bevor Sie die clean-Methode des Formulars erreichen, wurden die Feldvalidatoren bereits ausgeführt. Sie können prüfen, ob sie im Attribut "errors" des Formulars Fehler verursacht haben. (Django 1.8) –

6

Aus irgendeinem Grund die akzeptierte Antwort nicht für mich arbeiten (weiß nicht, ob es die Ursache Dinge haben sich geändert, oder ich bin mit einem Inline-Form oder was), aber überwiegendes full_clean gearbeitet:

class MyForm(forms.ModelForm): 
    def full_clean(self): 
     super(MyForm, self).full_clean() 
     if self.cleaned_data.get('film') and 'director' in self._errors: 
      del self._errors['director'] 
+0

Ich zweite was @Jack sagt. – prinzdezibel

Verwandte Themen