Django-filter: Übergabe eines Anfangswerts

Erstellt am 28. Aug. 2014  ·  5Kommentare  ·  Quelle: carltongibson/django-filter

Ich habe versucht, einen Anfangswert an das Formular zu übergeben, indem ich die folgenden Methoden separat ausprobiert habe (yadda ist ein Platzhalterwert):

#views.py
def operator_search(request):
    operators = Operator.objects.all()
    f = OperatorFilter(request.GET, initial={'operator_city':'yadda'}, queryset=Operator.objects.all())
    return render(request, 'vendors/operator_search.html', {'filter':f, 'operators':operators})
#forms.py
class OperatorFilter(django_filters.FilterSet):
     operator_city = django_filters.CharFilter(initial="yadda")
     class Meta:
         model = Operator

Beides scheint nicht zu funktionieren. Wie kann ich bei der Verwendung von Django-Filtern einen Anfangswert für das Formular setzen?

Hilfreichster Kommentar

im Fall von ChoiceField können Sie verwenden:
empty_label=None, null_value=<default-value>, null_label=<default-label>

Alle 5 Kommentare

Ich frage mich das auch, ich habe die verschiedenen Filter-, FilterSet- und Form-Objekte durchforstet und keinen anständigen Weg gefunden, dies zu tun. Ich glaube nicht, dass initial funktioniert, weil es ein gebundenes Formular verwendet, obwohl ich keine gute Arbeit gefunden habe, um die Daten selbst zu übergeben. Ich habe eine Problemumgehung durch das QueryDict gefunden und diese an das FilterSet übergeben, aber es muss einen saubereren Weg geben, dies zu tun.

Würde es Ihnen etwas ausmachen, einen Ausschnitt Ihrer Problemumgehung zu veröffentlichen? Ich stecke an diesem Punkt irgendwie fest und meine Benutzer sind es leid, dass ihre Suche standardmäßig auf Afghanistan lautet :)

Hallo @chromakey — Ich denke, dies ist eine Verwendungsfrage, daher ist sie besser auf die Mailingliste ausgerichtet .

Die Daten des Formulars werden jedoch nur an das FilterSet übergeben. Wenn ich Sie also richtig verstehe, sollten Sie in der Lage sein, Folgendes zu tun:

initial = {'operator_city':'yadda'}
initial.update(request.GET)
f = OperatorFilter(initial, ...)

Wenn dies nicht der Fall ist, folgen Sie bitte der Mailingliste und erklären Sie mehr. Vielen Dank.

Ich habe die Mailingliste durchsucht, aber keine Lösung gefunden. Hier ist eine Problemumgehung, die ich herausgefunden habe (verwenden Sie nach eigenem Ermessen):

 ####### WARNING: this is a hack to enable initial filter field selection in django-filters########
# Create a mutable QueryDict object, default is immutable
initial = QueryDict('active_study=True', mutable=True)
# QueryDict update works different than normal dictionary update. Refer to docs.
initial.update(request.GET)
# Place the hacked, mutable QueryDict to the FilterSet.
filter = StudyFilter(initial, queryset=Study.objects.all())

im Fall von ChoiceField können Sie verwenden:
empty_label=None, null_value=<default-value>, null_label=<default-label>

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

sassanh picture sassanh  ·  4Kommentare

techdragon picture techdragon  ·  5Kommentare

xtrinch picture xtrinch  ·  4Kommentare

csarcom picture csarcom  ·  3Kommentare

hakib picture hakib  ·  3Kommentare