1

これが私の 2 つの検索機能の間で発生している理由がわかりません。

ここに私の最初の検索機能があります

    def search(request):
    if 'q' in request.GET and request.GET['q']:
    q = request.GET['q']
    books = Book.objects.filter(title__icontains = q)
    return render_to_response('search_results.html', {'books': books, 'query': q})
    else:
    return render_to_response('search_form.html', {'error': True})

この機能で、入ると

    http://127.0.0.1:8000/search/ 

ブラウザに表示されるのは、検索バーと作成したメッセージです。また、検索ボタンを押すと、リンクが自動的に更新されます

    http://127.0.0.1:8000/search/?q=

ただし、私の検索機能の 2 番目のバージョンでは

    def search(request):
        error = False
        if 'q' in request.GET['q']:
            q = request.GET['q']
            if not q:
             error = True
            else:
             books = Book.objects.filter(title__icontains = q)
             return render_to_response('search_results.html', {'books': books, 'query': q})
    return render_to_response('search_form.html',{'error':error})

私が入るとしたら

    http://127.0.0.1:8000/search/ 

私のブラウザに、私は取得します

    Exception Type:      MultiValueDictKeyError
    Exception Value:    "Key 'q' not found in <QueryDict: {}>"

ブラウザで手動でリンクを作成する場合

    http://127.0.0.1:8000/search/?q= 

エラー メッセージは消えますが、パフォーマンス検索を行った場合、検索バーに入力して検索を実行したリンクを更新する以外は何もしない検索バーしか表示されません。

    EX: searched for eggs --> http://127.0.0.1:8000/search/?q=eggs

ここに私のHTMLファイルがあります

search_results.html

    <p>You searched for: <strong>{{ query }}</strong></p>

    {% if books %}
        <p>Found {{ books|length }} book{{ books|pluralize }}.</p>
        <ul>
            {% for book in books %}
            <li>{{ book.title }}</li>
            {% endfor %}
        </ul>
    {% else %}
        <p>No books matched your search criteria.</p>
    {% endif %}

search_form.html

    <html>
    <head>
        <title>Search</title>
    </head>
    <body>
        {% if error %}
            <p style = "color: red;">Please submit a search term.</P>
        {% endif %}
        <form action = "/search/" method = "get">
            <input type = "text" name = "q">
            <input type = "submit" value = "Search">
        </form> 
    </body>
    </html>

どんな助けでも大歓迎です!ありがとう!

4

2 に答える 2

4

次のように入力します。

if 'q' in request.GET['q']:

そして、次のように入力する必要があります:

if 'q' in request.GET:

不足しているアイテムにアクセスしようとしたため、失敗しました。
次のこともできます。

if request.GET.get('q', False):
于 2013-02-25T11:53:29.633 に答える
1

Zulu の発言に追加すると、get()辞書に属するメソッドを使用して、コードを少し整理できます。

def search(request):

    query = request.GET.get("q", None)

    if query:
        books = Book.objects.filter(title__icontains = query)
        return render_to_response("search_results.html", {"books": books, "query": query})

    # if we're here, it's because `query` is None
    return render_to_response("search_form.html", {"error": True})
于 2013-02-25T12:06:24.500 に答える