Python Django搜索中的多属性
所以我有这个搜索表: [医生][专科][城市] 这是HTML格式的表单:Python Django搜索中的多属性,python,html,django,twitter-bootstrap-3,Python,Html,Django,Twitter Bootstrap 3,所以我有这个搜索表: [医生][专科][城市] 这是HTML格式的表单: <form data-provide="validation" data-disable="true" class="input-glass mt-7" method='POST' action='annuaire/'> {% csrf_token %} <div class="row"> <
<form data-provide="validation" data-disable="true" class="input-glass mt-7" method='POST' action='annuaire/'>
{% csrf_token %}
<div class="row">
<div class="col-md-4">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="ti-search mt-1"></i></span>
</div>
<input type="text" class="form-control" placeholder="Doctor's Name" name="kw_name">
</div>
</div>
<div class="col-md-4">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="ti-search mt-1"></i></span>
</div>
<select class="form-control" name="kw_specialty">
<option value="" disabled selected>Specialty</option>
{% for spec in specialties %}
<option>{{ spec }}</option>
{% endfor %}
</select>
</div>
</div>
<div class="col-md-4">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="ti-search mt-1"></i></span>
</div>
<select class="form-control" name="kw_city">
<option value="" disabled selected>City</option>
{% for city in cities %}
<option>{{ city }}</option>
{% endfor %}
</select>
</div>
</div>
</div>
<div class="row mt-2">
<div class="col-md-12">
<button class="btn btn-lg btn-block btn-outline-light" type="submit" name="search_btn">Search</button>
</div>
</div>
</form>
谢谢你的帮助
PS:我已经在视图中加入了一些ifs和ELSE,试图解决这个问题,但它仍然不起作用。有时它会给我不满足任何搜索条件的结果。我已经能够通过使用字典成功地使用用户筛选器,然后在
filter()
函数中解压它们。对于您的情况,我将尝试以下方法:
def search(request):
val_name = request.POST.get('kw_name', '')
filters = {
'city__title__icontains': request.POST.get('kw_city'),
'specialty__title__icontains': request.POST.get('kw_specialty')
}
filters = {k: v for k, v in filters.items() if v}
q = Q(user__first_name__icontains=val_name) | Q(user__last_name__icontains=val_name)
doctors = Doctor.objects.filter(q, **filters)
context = {
'page_title': 'Résultats des médecins',
'doctors': doctors,
}
return render(request, "dashboard/results.html", context)
这两个下拉菜单都可以使用(除了('kw_city')后面缺少一个逗号。但是名称字段不起作用,即使他们的名字不在搜索范围内,它也会给我所有结果。谢谢,我错过了那个逗号,对不起。当你说它不起作用时,我不明白。如果用户没有填写文本输入(医生的名字)然后结果显示与其他两个过滤器匹配的所有医生。这不是你期望的行为吗?你能给我一个例子说明为什么它不起作用吗?如果我没有选择两个下拉列表中的任何一个并在“名称”字段中输入任何名称,它仍然会给我所有对象,而不是只有具有该名称的对象。它不应该,我有在我的一个项目中测试了几乎相同的代码,并且效果良好。尽管如此,我还是更新了我的答案。你能按原样试用吗?试着复制和粘贴与我刚才给你的代码完全相同的代码(我这么说是因为我看到你在该视图中有其他逻辑)
def search(request):
val_name = request.POST.get('kw_name', '')
filters = {
'city__title__icontains': request.POST.get('kw_city'),
'specialty__title__icontains': request.POST.get('kw_specialty')
}
filters = {k: v for k, v in filters.items() if v}
q = Q(user__first_name__icontains=val_name) | Q(user__last_name__icontains=val_name)
doctors = Doctor.objects.filter(q, **filters)
context = {
'page_title': 'Résultats des médecins',
'doctors': doctors,
}
return render(request, "dashboard/results.html", context)