Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django搜索中的多属性_Python_Html_Django_Twitter Bootstrap 3 - Fatal编程技术网

Python Django搜索中的多属性

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"> <

所以我有这个搜索表: [医生][专科][城市]

这是HTML格式的表单:

          <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)