1

我在 Django 项目中有一个简单的搜索应用程序,可以在 CMS 管理员中进行搜索。这是生成 URL 的表单:

<form method="get" action="/search">
            <p><label for="id_q">搜索:
            < input type="text" name="q" id="id_q" />
            < input type="submit" value="Submit" /></p>
        
,这是网址:
(r'^search/$', 'search.views.search'),
这是视图:
def 搜索(请求):
    查询 = request.GET['q']
    结果 = FlatPage.objects.filter(content__icontains=query)
    模板 = loader.get_template('search/search.html')
    上下文=上下文({'查询':查询,'结果':结果})
    响应 = 模板。渲染(上下文)
    返回 HttpResponse(响应)
,这是模板:
<html>
    <头>
        <title>搜索页面
    </头>
    <正文>
        < p>您搜索了“{{ query }}”;结果如下。</p>
        <ul>
            {% for page in results %}
                <li><a href="{{ page.get_absolute_url }}">{{ page.title }}</a></li>
            {% endfor %}
        </ul>
    </正文>
</html>
但我不断收到此错误:
"在 <QueryDict: {} > 中找不到键 'q'"
. 有谁为什么,我能做什么?

4

3 回答 3

2

大概在您首次请求页面时,在您提交搜索词之前发生此错误 - 很明显,q在请求中找不到该字段。您只需要先检查它:

def search(request):
    if 'q' in request.GET:
        query = request.GET['q']
        results = FlatPage.objects.filter(content__icontains=query)
于 2011-08-07T18:54:16.407 回答
1

当您在提交中发布结果时,您正在使用 request.GET 。使用 Daniel 提到的检查和使用 POST 代替:

def search(request):
    if 'q' in request.GET:
      query = request.GET['q']
      results = FlatPage.objects.filter(content__icontains=query)
    else:
      query = ""
      results = None
    template = loader.get_template('search/search.html')
    context = Context({ 'query': query, 'results': results })
    response = template.render(context)
    return HttpResponse(response)        
于 2011-08-07T19:02:56.163 回答
0

您可以将行从更改query = request.GET['q']query = request.GET.get('q')

注意get()功能......当然这里的其他答案也可以。看到这个类似的问题:

“instancemethod”对象没有属性“__getitem__”

于 2013-08-29T04:07:31.830 回答