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?

Dann eines
quelle
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

Marianobianchi
quelle
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)
sgauri
quelle