2017-09-22 3 views
1

Actuellement, la page Web affiche une liste de résultats trouvés triés par distance (similaire à ListView). Ce que je voudrais faire est de créer un filtre pour affiner davantage ces résultats.Filtrage des résultats de Geodjango à l'aide des vues basées sur les fonctions

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,}) 

Les travaux de filtrage Actuellement, mais pas pour les variables qualitatives. Par exemple, si je change l'emplacement ou le rayon de recherche, le formulaire est mis à jour et je vois de nouveaux résultats.

Cependant, j'ai une variable catégorielle appelée TYPE qui peut être soit gratuite ou payante. Si une personne sélectionne un filtre GRATUIT, affichez uniquement les résultats qui sont gratuits et vice versa. Ce sont des champs booléens dans mon modèle.

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

Ce que j'ai essayé d'ajouter une sorte de paramètre de filtre qui fonctionne de façon similaire à

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

new_result_set = results.filter(filter_variable) 

Est-ce un moyen efficace de filtrer? J'ai regardé dans django-filter, mais je n'avais pas l'air compatible avec geodjango et j'ai l'impression d'être trop exigeant pour ce dont j'ai besoin.

Répondre

1

est-ce?

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

Merci beaucoup cela fonctionne très bien. Y a-t-il un moyen que je pourrais utiliser dans le fichier template.html pour mettre les balises sélectionnées sur les options, afin qu'elles reflètent la balise sélectionnée actuelle. Par exemple. Roma

+0

Je pense que oui, mais je ne peux pas comprendre les détails de votre question. Vous pouvez essayer de le rechercher sur le SO, sinon le succès écris une question. –

+0

Merci, je dois faire quelques recherches et essayer le code. Si je ne peux pas comprendre, je vais demander à nouveau. Merci – Roma