首页 文章

Django CMS annonying错误

提问于
浏览
1

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

< form method="get" action="/search">
            < p>< label for="id_q">Search:
            < input type="text" name="q" id="id_q" />
            < input type="submit" value="Submit" />< /p>

,这是URL:

(r'^search/$', 'search.views.search'),

这是视图:

def search(request):
    query = request.GET['q']
    results = FlatPage.objects.filter(content__icontains=query)
    template = loader.get_template('search/search.html')
    context = Context({ 'query': query, 'results': results })
    response = template.render(context)
    return HttpResponse(response)

,这是模板:

< html>
    < head>
        < title>Search page
    < /head>
    < body>
        < p>You searched for "{{ query }}"; the results are listed below.< /p>
        < ul>
            {% for page in results %}
                < li>< a href="{{ page.get_absolute_url }}">{{ page.title }}< /a>< /li>
            {% endfor %}
        < /ul>
    < /body>
< /html>

但我一直收到此错误:

"Key 'q' not found in < QueryDict: {} >"

. 有谁为什么,我该怎么办?

3 回答

  • 0

    据推测,在您提交搜索词之前首次请求页面时会发生此错误 - 很明显,请求中找不到 q 字段 . 你只需要先检查一下:

    def search(request):
        if 'q' in request.GET:
            query = request.GET['q']
            results = FlatPage.objects.filter(content__icontains=query)
    
  • 2

    当您在提交中发布结果时,您正在使用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)
    
  • 1

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

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

    'instancemethod' object has no attribute 'getitem'

相关问题