0

我有一个 django 视图,可以在我的数据库中搜索包含用户在表单上提交的文本的名称。

当我使用搜索时,我会根据每条记录的和字段.filter检查用户查询。一切正常,但我的问题是,如果用户在搜索框中输入带有空格的全名(例如,“John Smith”而不是“john”或“smith”,我的函数将不返回任何结果!first_namelast_name

这一切都很新,我不确定我将如何改变功能甚至形式。我可能只是懒惰并阻止他们输入空格键(我认为这是可能的)或其他东西,但我想了解我的问题的实际解决方案?

这是表单和视图,它们非常简单:

<form action="/Speakers/Search" method="get">
    <input type="text" name="q">
    <input type="submit" value=" Search ">
    </form>

完整的附带问题:刚刚意识到,因为我一直在使用带换行的文本编辑器,我忘记了我仍然不知道在 python 中添加换行符在哪里“安全”?重要的是缩进吗..?所以很抱歉不得不滚动下面的代码:

def SearchSpeakers(request):
    if 'q' in request.GET and request.GET['q']: #2nd condition return false if emtpy string
        search = request.GET['q']
        message = "You searched for: %s." % search
        results = Speaker.objects.filter(Q(first_name__icontains=search) | Q(last_name__icontains=search))
        if not results: #returned empty
            message += " We could not find the name you entered in our Speakers List but you check back again before the event! Press clear to see the complete list again."

        return render_to_response('Speakers.html', {'speakers':results, 'query': message})
    else:
        message = "You did not enter a name."
        return render_to_response('Speakers.html',{'query':message})
4

2 回答 2

2

你可以使用更多的Q() 对象

import operator
results = Speaker.objects.filter(reduce(operator.or_,
              (Q(first_name__icontains=term)|Q(last_name__icontains=term)
               for term in request.GET.get('q', '').split())
于 2012-06-22T14:36:17.457 回答
1

看起来您的问题是您正在使用全名搜索 first_name 或 last_name 字段。您可以添加一些逻辑来检查输入(在空格或逗号上拆分)并在循环中搜索整个名称的每个成员。我不熟悉 Django 但

search = request.GET['q']
message = "You searched for: %s." % search
for term in list(set(search.split())):
    # ...search each term and compile into a set of results
于 2012-06-22T14:03:07.340 回答