Django多值搜索栏

时间:2014-05-07 15:24:44

标签: python html django

对于我的网站,我正在尝试设计一个搜索栏,用于过滤某个类的多个属性,例如姓名和电话。 但是,我不知道如何从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>

2 个答案:

答案 0 :(得分:0)

我对您的代码进行了一些更改。首先,我使用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})

答案 1 :(得分:0)

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

输入应该是内部指定&#34;操作&#34;

的表单

加上我修复了我的代码,所以我也发布了它:

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