更改查询字符串以允许多个值
Change query string to allow for multiple values
I have an issue with my query string, the problem is when multiple values are selected my Django search breaks.我在 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>
views.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,
})
您需要使用 GET
属性的 getlist()
方法。
例如:
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.com/en/3.0/ref/request-response/#django.http.QueryDict.getlist
https://docs.djangoproject.com/en/3.0/topics/db/queries/#complex-lookups-with-q-objects
感谢大家的建议,他们确实帮助了我,但我在下面制定的解决方案是对阅读此问题的任何人最有帮助的答案。下面的代码非常适合我的要求,并允许搜索多个值。
我能够使用 getlist 方法,然后使用 functools 模块(用于高阶函数)和 reduce。运算符允许 and
或 or
,我目前正在使用 and
,它显示仅匹配所有搜索值的用户结果。
花了一些时间才到这里,希望这对其他人有帮助!
Views.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')
I have an issue with my query string, the problem is when multiple values are selected my Django search breaks.我在 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>
views.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,
})
您需要使用 GET
属性的 getlist()
方法。
例如:
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.com/en/3.0/ref/request-response/#django.http.QueryDict.getlist
https://docs.djangoproject.com/en/3.0/topics/db/queries/#complex-lookups-with-q-objects
感谢大家的建议,他们确实帮助了我,但我在下面制定的解决方案是对阅读此问题的任何人最有帮助的答案。下面的代码非常适合我的要求,并允许搜索多个值。
我能够使用 getlist 方法,然后使用 functools 模块(用于高阶函数)和 reduce。运算符允许 and
或 or
,我目前正在使用 and
,它显示仅匹配所有搜索值的用户结果。
花了一些时间才到这里,希望这对其他人有帮助!
Views.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')