更改查询字符串,允许多个值

问题描述 投票:0回答:1

我的查询字符串有一个问题,问题是当选择多个值时,我的Django搜索会中断。我在URL中得到这样的结果 ?Query=value1&Query=Value2. 在这种情况下,只有最后一个值被搜索到。我想发生的情况是,两个值都被搜索到(相当于一个 AND 中间的运算符)。)

这就是我们想要的结果 ?Query=value1+Value2.

我已经在下面添加了我的使用Select2的搜索表单和我的Django搜索视图。如果你还需要什么,现在就告诉我。

任何帮助将是非常感激的。

前端的搜索表单

<form id="makeitso" role="search" action="" method="get">                   
            <select class="js-example-placeholder-multiple" name="query" multiple="multiple">
                <option value="Value 1">Value 1</option>   
                <option value="Value 2">Value 2</option>   
                <option value="Value 3">Value 3</option>     
            </select>

               <script>
                   $(".js-example-placeholder-multiple").select2({
                       placeholder: "Search here",
                   });
               </script>

       <div class="form-inline justify-content-center">
           <button type="submit"  class="btn btn-xlarge">Search</button>
       </div>
   </form>

视图.py

def search(request):
        search_query = request.GET.get('query', None)
        page = request.GET.get('page', 1)

        # Search
        if search_query:
            search_results = TestPage.objects.live().search(search_query)
            query = Query.get(search_query)

            # Record hit
            query.add_hit()
        else:
            search_results = TestPage.objects.none()

        # Pagination
        paginator = Paginator(search_results, 3)
        try:
            search_results = paginator.page(page)
        except PageNotAnInteger:
            search_results = paginator.page(1)
        except EmptyPage:
            search_results = paginator.page(paginator.num_pages)

        return render(request, 'search/search.html', {
            'search_query': search_query,
            'search_results': search_results,
        })
html django jquery-select2
1个回答
1
投票

你需要使用 getlist() 的方法 GET 属性。

比如说。search_query = request.GET.get('query', None)

应该是

search_query = request.GET.getlist('query', None)

然后,你可以像这样循环浏览所有的搜索查询。

for query in search_query:

然后你可以使用 Q Objects 用于更复杂的查询。

q = Q()
for query in search_query:
    q |= Q(term=query)
ModelToQuery.objects.filter(q)

https:/docs.djangoproject.comen3.0refrequest-response#django.http.QueryDict.getlist。

https:/docs.djangoproject.comen3.0topicsdbqueries#complex-lookups-with-q-objects。


1
投票

谢谢大家的建议,确实对我有帮助,但我下面研究出的解决方案是对看到这个问题的人最有帮助的答案。下面的代码完全可以满足我的要求,并且允许搜索多个值。

我能够使用getlist方法,然后使用functools模块(用于高阶函数)与reduce。该操作符允许 andor,我现在使用的是 and 其中向用户展示了只与所有搜索值相匹配的结果。

花了点时间才到这里,希望对大家有所帮助!

视图.py

def search(request):
    page = request.GET.get('page', 1)

    search_query = request.GET.getlist('query' , None)

    # searches for results that match all values
    query = functools.reduce(operator.and_, (Q(test_body__contains = i) for i in search_query))

    search_results = TestPage.objects.filter(query).distinct().order_by('-latest_revision_created_at') 

0
投票

下面的格式应该可以用

#Views.py
Edit: from django.db.models import Q

def get_queryset(query=None):
    queryset = []
    queries = query.split(" ") 
    for q in queries:
        page = TestPage.objects.filter(
                Q(obj1__icontains=q) | 
                Q(obj2__icontains=q)
            ).distinct()

        for page in pages:
            queryset.append(page)

    return list(set(queryset))

这样你就可以循环浏览多个不同指标的页面,即页码或字数。(用上面的obj1和obj2表示)

Edit:query = query.split将分割对象(单词或数字)之间的 "空间",这样你就可以在一个大的集合中搜索对象,而这个集合可能有一个以上的段。它将通过把每一个段转化为可搜索列表中的字符串来实现,所以 "page 16 "将变成['page' , '16']。

© www.soinside.com 2019 - 2024. All rights reserved.