Python 使用基于函数的视图过滤Geodjango结果

Python 使用基于函数的视图过滤Geodjango结果,python,django,geodjango,Python,Django,Geodjango,当前,该网页显示按距离排序的已找到结果列表(类似于ListView)。我想做的是创建一个过滤器来进一步缩小这些结果的范围 视图.py def teacher_list(request, **kwargs): if request.method == 'GET': form = LocationForm(request.GET) if form.is_valid(): SearchPoint = Point(form.cleaned

当前,该网页显示按距离排序的已找到结果列表(类似于ListView)。我想做的是创建一个过滤器来进一步缩小这些结果的范围

视图.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
的分类变量,它可以是免费的,也可以是付费的。如果一个人选择了一个免费的过滤器,则只显示免费的结果,反之亦然。这些是我的模型中的布尔字段

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)
这是一种有效的过滤方法吗?我查看了django过滤器,但看起来与geodjango不兼容,对于我所需要的东西来说,这似乎是一个过分的选择。

是吗

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

谢谢,这很有效。我是否可以在template.html中使用任何方法将选定的标记放在选项上,以便它反映当前选定的标记。我想是的,但我无法理解你问题的细节。你可以试着在网上搜索,如果没有成功,写一个问题。谢谢,我需要做一些研究,并尝试代码。如果我不明白,我会问新的。谢谢你很高兴能帮助你!