【问题标题】:Django multi-valued search barDjango 多值搜索栏
【发布时间】:2014-05-07 15:24:44
【问题描述】:

对于我的网站,我正在尝试设计一个搜索栏,该搜索栏将过滤某个类的多个属性,例如姓名和电话。 但是,我不知道如何从 python 的一页中获取多个值。我做了很多尝试,但都失败了。 我正在发布最新的(这也不起作用)。我真的需要一些帮助。

def search(request):
errors = []
if 'q1' in request.GET:
    q1 = request.GET['q1']
if 'q2' in request.GET:
        q2 = request.GET['q2']
    if not (q1 or q2):
        errors.append('Enter a search term.')
    elif ((len(q1) > 20) or (len(q2) > 20)):
        errors.append('Please enter at most 20 characters.')
    elif q1 and (not q2):
        hotels = Hotel.objects.filter(name__icontains=q1)
        return render(request, 'company/search_results.html', {'hotels': hotels, 'query': q1})
    elif ((not q1) and q2):
        hotels = Hotel.objects.filter(street__icontains=q2)
        return render(request, 'company/search_results.html', {'hotels': hotels, 'query': q2})
    else:
    names = Hotel.objects.filter(name__icontains=q1)
        streets = Hotel.objects.filter(street__icontains=q2)
    hotels = (names and streets)
        return render(request, 'company/search_results.html', {'hotels': hotels, 'query': (q1 or q2)})
return render(request, 'company/search_form.html',
    {'errors': errors})

我还在获取输入的地方发布了部分 html 代码。

<table align="center">
        <tr>
            <td>name:</td>
            <td><input type="text" name="q1"></td> 
        </tr>
        <tr>
            <td>telephone:</td>
            <td><input type="text" name="q2"></td> 
        </tr>
    </table>
    <form action="/company/search/" method="get">
        <input type="submit" value="Search">
   </form>

【问题讨论】:

    标签: python html django


    【解决方案1】:

    我对您的代码进行了一些更改。首先,我使用get() 来获取参数,因此您不需要在request.GET 中使用if。接下来我使用了chaining QuerySet filters。最后,我让它将 q1 和 q2 返回到模板。当你可以同时输入一个查询时,只返回一个查询是没有意义的。

    def search(request):
        errors = []
        q1 = request.GET.get('q1')
        q2 = request.GET.get('q2')
        if not (q1 or q2):
            errors.append('Enter a search term.')
        elif ((len(q1) > 20) or (len(q2) > 20)):
            errors.append('Please enter at most 20 characters.')
        else:
            hotels = Hotel.objects.all()
            if q1:
                hotels = hotels.filter(name__icontains=q1)
            if q2:
                hotels = hotels.filter(street__icontains=q2)
        return render(request, 'company/search_results.html', {'hotels': hotels, 'q1': q1, 'q2': q2, 'errors': errors})
    

    【讨论】:

      【解决方案2】:

      如果有人关心,我会在我的代码中发现以下错误:

      输入应该是inside指定“动作”的表单

      另外我修复了我的代码,所以我也发布了它:

      def search(request):
      errors = []
      q1 = None
      q2 = None
      if 'name' in request.GET:
          q1 = request.GET['name']
      if 'telephone' in request.GET:  
          q2 = request.GET['telephone']
      if not (q1 or q2):
              errors.append('Enter a search term.')
      elif q1 and (not q2):
              hotels = Hotel.objects.filter(name__icontains=q1)
              return render(request, 'company/search_results.html', {'hotels': hotels, 'query': q1})
      elif ((not q1) and q2):
              hotels = Hotel.objects.filter(number__icontains=q2)
              return render(request, 'company/search_results.html', {'hotels': hotels, 'query': q2})
      else:
          names = Hotel.objects.filter(name__icontains=q1)
              streets = Hotel.objects.filter(number__icontains=q2)
          hotels = (names and streets)
              return render(request, 'company/search_results.html', {'hotels': hotels, 'query': (q1 or q2)})
      return render(request, 'company/search_form.html',
          {'errors': errors})
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-09-17
        • 2012-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-28
        • 1970-01-01
        相关资源
        最近更新 更多