Django CMS раздражающая ошибка - PullRequest
1 голос
/ 07 августа 2011

У меня есть простое приложение для поиска в рамках проекта 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 ]

2 голосов
/ 07 августа 2011

Предположительно, эта ошибка возникает, когда вы впервые запрашиваете страницу, прежде чем отправить поисковый запрос - поэтому очевидно, что поле q не найдено в запросе.Вам просто нужно сначала проверить это:

def search(request):
    if 'q' in request.GET:
        query = request.GET['q']
        results = FlatPage.objects.filter(content__icontains=query)
1 голос
/ 07 августа 2011

Вы используете request.GET, когда публикуете результаты в подтверждении.Используйте оба чека, упомянутых Даниэлем И используйте вместо него 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)        
0 голосов
/ 29 августа 2013

Вы можете изменить строку с query = request.GET['q'] на query = request.GET.get('q')

Обратите внимание на функцию get() ... Конечно, другие ответы здесь также будут работать.Смотрите этот похожий вопрос:

У объекта 'instancemethod' нет атрибута '__getitem __'

...