繁体   English   中英

Django_Filters 和查询集

[英]Django_Filters and queryset

大家好,我正在构建一个简单的 django 网站,用户可以在其中寻找长时间的游戏。 现在的问题是我无法弄清楚为什么使用 django_filters 库构建的过滤器不起作用。

如果您在家中的搜索栏中键入“Queen”,您将被重定向到 searchs.html,其中列出了 Queen 的所有 LP(仅 4 个)。 左边有一个过滤器。 如果您在表单中输入“kind”并提交,那么您应该只会看到专辑“Kind of Magic”。 这行不通。 我认为问题在于查询集“sp”:

class searchesView(TemplateView):
    template_name = "search/searches.html"

    def post(self, request, *args, **kwargs):
        print('FORM POSTED WITH {}'.format(request.POST['srh']))
        srch = request.POST.get('srh')

        if srch:

            sp = Info.objects.filter(Q(band__icontains=srch)) | Info.objects.filter(Q(disco__icontains=srch))
            myFilter = InfoFilter(request.GET, queryset=sp)
            sp = myFilter.qs

            paginator = Paginator(sp, 10)
            page_number = request.GET.get('page')
            page_obj = paginator.get_page(page_number)

            return render(self.request, 'search/searches.html', {'sp':sp, 'myFilter':myFilter,
                                                                       'page_obj': page_obj
                                                                       })
        else:
            return render(self.request, 'search/searches.html')

我认为问题在于查询集,因为那时我尝试构建一个 result.html 页面,我在该页面中列出了数据库中的所有 LP,并在上面应用了相同的过滤器,在这里它完美地工作:

def result(request):
    result = Info.objects.all()
    myFilter = InfoFilter(request.GET, queryset=result)
    result = myFilter.qs
    return render (request, 'search/result.html', {'result':result, 'myFilter':myFilter})

不同之处在于,在第一种情况下,我有一个带有特定查询集的 TemplateView,而在第二种情况下,我有一个带有不同查询集的简单 function。 有人知道问题可能是什么吗? 如果您想试用该网站,我已上传到 repl 上的代码: https://Django-Template.edwardradical.repl.co

非常感谢!

问题与这里的 POST/GET 混合有关。

您正在从此处的两个 post/get 字典中读取参数,这对于 go 来说不是一个很好的模式。

在这种情况下,对带有过滤器的 url 的 POST 请求应该会产生正确的结果,即:

POST /searches/?band=kind&disco=
{
  srh: data
}

在当前的解决方案中,我认为 srh 不包含在帖子正文中,这会导致查询集中出现问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM