2017-09-22 3 views
1

Derzeit wird auf der Webseite eine Liste der gefundenen Ergebnisse angezeigt, die nach Entfernung sortiert sind (ähnlich wie bei der ListView). Was ich tun möchte, ist einen Filter zu erstellen, um diese Ergebnisse weiter einzugrenzen.Filtern von Geodjango-Ergebnissen mit funktionsbasierten Ansichten

Views.py

def teacher_list(request, **kwargs): 

    if request.method == 'GET': 
     form = LocationForm(request.GET) 
     if form.is_valid(): 
      SearchPoint = Point(form.cleaned_data['Lng'], form.cleaned_data['Lat']) 
      Radius = form.cleaned_data['SearchRadius'] 
      Type = form.cleaned_data['Type'] 
     else: 
      form = LocationForm() 
      SearchPoint = Point(0, 0) 
      Radius = form.cleaned_data['SearchRadius'] 
    else: 
     form = LocationForm() 
     SearchPoint = Point(0, 0) 
     Radius = form.cleaned_data['SearchRadius'] 

    results = Teacher.objects.filter(location__distance_lte= 
            (SearchPoint, D(km=Radius)))\ 
     .annotate(distance=Distance('location', SearchPoint))\ 
     .order_by('distance') 


    return render(request, "users/teacher_list.html", context={"form": form,"teacher_list":results,}) 

Derzeit Filterung funktioniert, aber nicht für kategorische Variablen. Zum Beispiel, wenn ich den Ort oder den Suchradius ändere, wird das Formular aktualisiert und ich sehe neue Ergebnisse.

Allerdings habe ich eine kategorische Variable namens TYPE, die entweder frei oder bezahlt werden kann. Wenn eine Person einen FREE-Filter auswählt, werden nur Ergebnisse angezeigt, die frei sind und umgekehrt. Dies sind boolesche Felder in meinem Modell.

class Teacher(models.Model): 
    free = models.BooleanField() 
    paid = models.BooleanField() 

Was ich versuchte, indem es eine Art von Filterparameter, die ähnlich wie

if Type == 'Free': 
    filter_variable = 'free=True' 
elif Type == 'Paid': 
    filter_variable = 'paid=True' 
else: 
    filter_variable ='' 

new_result_set = results.filter(filter_variable) 

Ist das ein effizienter Weg zu filtern funktionieren? Ich habe mich mit dem Django-Filter beschäftigt, aber nicht mit Geodjango kompatibel und scheint für mich das Overkill zu sein.

Antwort

1

ist es?

filter_variable = {Type.lower(): True} if Type else {} 
new_result_set = results.filter(**filter_variable) 
+0

Danke das funktioniert super. Gibt es irgendeine Möglichkeit, die ich in der template.html verwenden könnte, um ausgewählte Tags auf Optionen zu setzen, so dass sie das aktuell ausgewählte Tag widerspiegelt. Z.B. Roma

+0

ich denke ja, aber ich kann die Details Ihrer Frage nicht verstehen. Sie können versuchen, es auf der SO zu suchen, wenn nicht, schreiben Sie eine Frage. –

+0

Danke, ich muss etwas recherchieren und den Code ausprobieren. Wenn ich nicht herausfinden kann, werde ich neu fragen. Danke – Roma