如何解决Django使用多个查询进行过滤
我的主页上有一个搜索栏,当您搜索某些内容时,它会将您重定向到包含结果(标题和文档类型)的页面。在页面的左侧,我想按文档类型实现过滤器。
搜索后,我的网址如下:http://127.0.0.1:8000/search/?document_type=Tehnical+report
应用过滤器后:http://127.0.0.1:8000/search/?q=something&document_type=Tehnical+report
我不知道如何实现过滤器以仅在搜索页面上由查询(q)过滤的对象列表中进行搜索。另外,我不确定在应用过滤器后,网址应该是http://127.0.0.1:8000/search/?document_type=Tehnical+report
还是DOCUMENT_TYPES = [
('Tehnical report','Tehnical report'),('Bachelor thesis','Bachelor thesis'),...
]
class Form_Data(models.Model):
title = models.CharField(unique=True,max_length=100,blank=False)
author = models.CharField(max_length=100)
document_type = models.CharField(choices=DOCUMENT_TYPES,max_length=255,blank=False,default=None)
。
models.py
def search_list(request):
object_list = Form_Data.objects.none()
document_types = DOCUMENT_TYPES
query = request.GET.get('q')
query_list = re.split("\s|(?<!\d)[,.](?!\d)",query)
document_type_query = request.GET.get('document_type')
for item in query_list:
object_list |= Form_Data.objects.filter( Q(title__icontains=item) | Q(author__icontains=item))
return render(request,"Home_Page/search_results.html")
views.py
<div class="Search">
<form action="{% url 'home_page:search_results' %}" method="get">
<input id="Search_Bar" type="text" name="q">
<button id="Button_Search" type="submit"></button>
</form>
</div>
home_page.html
{% for form_data in object_list %}
<h5>{{ form_data.title }}</h5>
<h5>{{ form_data.document_type }}</h5>
{% endfor %}
<form method="GET" action=".">
<select class="form-control" name="document_type">
{% for tag,label in document_types %}
<option value="{{ tag }}">{{ tag }}</option>
{% endfor %}
</select>
</form>
search_results.html
{{1}}
解决方法
这将是模型过滤:
query = request.GET.get('q')
document_type_query = request.GET.get('document_type')
object_list = FormData.objects.none()
for item in query.split():
item_qs = FormData.objects.filter(Q(title__icontains=item) | Q(author__icontains=item))
if document_type_query:
item_qs = item_qs.filter(document_type=document_type_query)
object_list |= item_qs
return render(request,"Home_Page/search_results.html",{"object_list": object_list})
这是URL:
http://127.0.0.1:8000/search/?q=something%20with%20spaces&document_type=Tehnical+report
,
我认为您的操作方式有误...我的意思是我不明白您为什么循环query
进行过滤。据我所知,它正在循环查询的每个字母。
我正在这样做,我会这样做(使用我自己的示例):
<form action='{% url 'products:search' %}' method='get'>
<input type='text' name='q' id='search' value='' >
<select name='category' id='category'>
<option value='' selected ></option>
<option value='packet'>Packet</option>
<option value='food'>Food</option>
<option value='vegetable'>Vegetable</option>
</select>
<input type='button' value='submit' >
</form>
views.py:
def search(request):
products = None
query = request.GET.get('q')
category = request.GET.get('category')
if query:
products = Product.objects.filter(
Q(name__icontains=query)|
Q(brand__icontains=query)
)
if category:
# since it is a choice field in the model
products |= Products.objects.filter(category=category)
context = {
'products': products,}
return render(request,'products/search_products.html',context)
在这种情况下,如果我按下“提交”按钮,我将得到一个类似以下的网址:
http://localhost:8000/products/search/?q=something&category=food
利用这些数据,我可以按名称或我想要的任何其他字段过滤产品。
我看不到有人会输入其查询并且搜索结果将具有在输入字段中输入任何字母的所有产品的情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。