2016-06-01 7 views
2

Ich arbeite mit Python2 und Django 1.9.Django-Formular: "Wählen Sie eine gültige Auswahl. Diese Auswahl ist keine der verfügbaren Optionen."

Grundsätzlich habe ich ein Formular, das zwei Dropdown enthält. Das zweite Dropdown hängt vom Wert des ersten ab.

Zum Beispiel, wenn Dropdown # 1 die Option "Category" ausgewählt hat, sollte Drop-down # 2 die Optionen "CategoryA, CategoryB und CategoryC" anzeigen. Wenn im Drop-down-Menü 1 die Option "Abteilung" ausgewählt ist, sollte in Dropdown-Liste 2 "Abteilung1, Abteilung2, Abteilung3" angezeigt werden.

Beachten Sie, dass sowohl "Departments" als auch "Categories" Klassen mit ihren entsprechenden Datenbanktabellen sind.

Also hier kommt meine Frage. Wie definiere ich dieses Formular? Genauer gesagt, wie gebe ich an, dass das zweite Formular manchmal Objekte aus der Klasse Category und manchmal Objekte der Klasse Department anzeigen wird?

Dies ist, was ich bisher:

class MyClassForm(forms.Form):] 
    name = forms.CharField(max_length=255) 
    dropdown1 = forms.ModelChoiceField(
     queryset=TypeOfCriteria.objects.all().order_by('name')) 
    dropdown2 = forms.ModelChoiceField(
     queryset=Department.objects.none()) 

Beachten Sie, wie ich dropdodown2 definiert haben:

dropdown2 = forms.ModelChoiceField(
     queryset=Department.objects.none()) 

Wie soll ich den Wert des Parameters queryset für dropdown2 definieren? Da ich die Klasse angeben muss, die abgefragt werden soll, um die Liste aller Instanzen zu erhalten, wie soll ich das tun?

Momentan lade ich den Inhalt von dropdown2 mit JQuery. Aber wenn ich den "send" -Button drücke, um die Post-Daten zu senden, bekomme ich immer den Fehler: "Wähle eine gültige Wahl. Diese Wahl ist keine der verfügbaren Wahlmöglichkeiten."

Antwort

4

Eine Option wäre, das Abfrage-Set dynamisch in der __init__-Methode des Formulars zu aktualisieren. Halten Sie den Rest Ihrer Formularklasse wie es ist, dann fügen Sie diesen Code:

def __init__(self, *args, **kwargs): 
    super(MyClassForm, self).__init__(*args, **kwargs) 
    if 'dropdown1' in self.data: 
     self.fields['dropdown2'].queryset = Department.objects.filter(typeofcriteria=self.data['dropdown1']) 
+0

Danke @raphv, aber ich bin nicht sicher, was „MyModel“ für stehen sollte ? Was sollte ich stattdessen tun? – Xar

+1

@Xar, sollte es wie 'Department.objects.filter (somefield = self.data ['selected_value'])' sein – Todor

2

In der init-Methode

def __init__(self, *arts, **kwargs): 
     super(MyClassForm, self).__init__(*args, **kwargs) 
     self.fields['dropdown2'].queryset = Department.objects.none() 
     if self.is_bound: 
     self.fields['dropdown2'].queryset = Department.objects.filter(# any value in self.data) 
Verwandte Themen