Erstellen Sie standardmäßig ein leeres Abfrageset in Django-Formularfeldern


168

Ich habe diese Felder in Form:

city = forms.ModelChoiceField(label="city", queryset=MyCity.objects.all())
district = forms.ModelChoiceField(label="district", queryset=MyDistrict.objects.all())
area = forms.ModelChoiceField(label="area", queryset=MyArea.objects.all())

Bezirk kommt von Klick auf Stadt und Fläche kommt von Klick auf Fläche. Mit queryset=MyDistrict.objects.all()und queryset=MyArea.objects.all()Form wird sehr schwer sein. Wie kann ich Querysets standardmäßig leer machen?


Meine vorgeschlagene Bearbeitung verbessert den Beitrag. Im Allgemeinen sollte kein Beitrag mit "Danke" enden. Es ist nicht persönlich, Kumpel. meta.stackexchange.com/questions/17878/…
Telarian

Antworten:


421

Sie können ein leeres Abfrageset haben, indem Sie dies tun:

MyModel.objects.none()

Obwohl ich nicht weiß, wie Sie dieses Formular verwenden sollen, können Sie es als Abfragesatz für Ihr Feld verwenden, um das zu erhalten, was Sie benötigen ...

Weitere Informationen finden Sie hier


4
In dem Anwendungsfall, dass sich Ihr Abfragesatz in Ihrer Ansicht basierend auf URL-Parametern ändert. Dann stellen Sie Ihrer Ansicht nach das richtige Abfrageset wie folgt ein: edit_form.fields ["Asset"]. Queryset = Asset.objects.filter (location_id = location_id)
radtek

Was ist, wenn ich kein Modell habe, mache ich nur ein values_list('something', flat=True)?
Boris

2

Der Kommentar von @ radtek sollte eine Antwort sein, da er in ähnlichen Szenarien nützlich ist, jedoch mit einem anderen Ansatz als die akzeptierte Antwort.

Wenn sich Ihr Abfragesatz mit der URL in Ihrer Ansicht ändert.

Ich erweitere die Antwort mit einem Beispiel, wie ich es verwendet habe:

def my_view(request):
    ...
    form = YourForm(initial={'field1':value1, 'field2':value2})
    form.fields['field3'].queryset = YourModel.objects.filter('foo'=bar)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.