2017-09-22 3 views
1

현재 웹 페이지는 거리별로 정렬 된 결과 목록을 표시합니다 (ListView와 유사). 내가하고 싶은 것은 필터를 만들어 이러한 결과를 더 좁히는 것입니다.함수 기반 뷰를 사용하여 Geodjango 결과 필터링

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

현재 필터링 작품,하지만 범주 변수. 예를 들어 위치 또는 검색 반경을 변경하면 양식이 업데이트되고 새로운 결과가 표시됩니다.

그러나 나는 TYPE이라는 범주 형 변수가 있는데,이 변수는 FREE 또는 PAID 일 수 있습니다. 사람이 무료 필터를 선택하면 무료 결과 만 표시하고 반대의 경우도 표시합니다. 내 모델의 부울 필드입니다.

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

내가 추가 시도하는 것은

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

new_result_set = results.filter(filter_variable) 

유사하게 작동합니다 필터 매개 변수의 일종이 필터링 할 수있는 효율적인 방법입니다? 나는 장고 필터를 들여다 보았지만 geodjango와 호환되지 않는 것처럼 보이고 내가 필요로하는 것이 과잉이라고 생각한다.

답변

1

입니까?

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

고맙습니다. template.html에서 옵션에 선택된 태그를 넣어서 현재 선택된 태그를 반영 할 수있는 방법이 있습니까? 예 : Roma

+0

네,하지만 귀하의 질문에 대한 자세한 내용을 이해할 수 없다고 생각합니다. 성공을 찾지 못하면 질문을 작성하여 검색 할 수 있습니다. –

+0

고마워, 나는 약간 연구를하고 부호를 시도 할 필요가있다. 알아낼 수 없다면, 나는 새 질문을 할 것이다. – Roma

관련 문제