4

簡単な検索を行い、ページ分割された形式で結果を返そうとしています。2 番目のページに移動しようとすると、検索用語が失われ、2 番目のページに結果がありません。

Djangoproject チュートリアルのページネーションの例を見つけて従いましたが、検索ビューの URL を記述する方法の例は見つかりませんでした。

以前は、表示するデータがほとんどなかったときにフォームで methodを使用していました (ただし、少し調査した結果、とPOSTの使用法の違いがわかりました)。さらに多くのデータを取得すると、ページネーションを使用するように制限されました。したがって、フォームメソッドをに変更しましたが、ここに問題があります。データを説明する方法がわからないため、データは正しいビューに送信されます。GETPOSTGETURL

私はそれを機能させようとしましPOSTたが、成功しませんでした。最後に、GET例に固執することにしましたが、この URL に出くわし、それが私を遠ざけています。

テンプレートと URL ファイルのコードは次のとおりです。

検索.py:

<form method="GET" id="searchForm" action="/search/?page=1">
    {% csrf_token %}
    <input type="text" id="billSearched" name="q_word">
    <input type="submit" value="{% trans "Look for" %}">
</form>

urls.py:

urlpatterns = patterns('',
    url(r'^$','ps.views.bills',name="bills"),
    url(r'^i18n/', include('django.conf.urls.i18n')),
    url(r'^search/$','ps.views.search',name="search"),)

のために多くのフォームを試しましたURLが、成功したものはありません。

すなわち:

url(r'^search/(?P<page>\d+)/$','ps.views.search',name="search") url(r'^search/','ps.views.search',name="search") url(r'^search/(?P<page>\d+)/(?P<searchTerm>\w*)','ps.views.search',name="search")

説明/解決策をいただければ幸いです。前もって感謝します!

アップデート:

def search(request):
    searchTerm = ""
    page = 1
    import pdb
    pdb.set_trace()
    if 'q_word' in request:
        searchTerm = request.GET['q_word']
    if 'page' in request:
        page = request.GET['page']
    found_bills = Bill.objects.filter(name__icontains = searchTerm)
    paginator = Paginator(found_bills,25)
    try:
        current_page = paginator.page(page)
    except PageNotAnInteger:
        current_page = paginator.page(1)
    except (EmptyPage, InvalidPage):
        current_page = paginator.page(paginator.num_pages)
    bills_list = list(current_page.object_list)
    return render_to_response('results.html',{"bills_list":bills_list,"current_page":current_page,},context_instance=RequestContext(request))

更新#2:

使用するpdbと、クライアントからサーバーに渡されるデータがないことがわかります。それに取り組む必要がありますが、それでも、検索時間を短縮できるため、情報やヒントは本当にありがたいです:)

(Pdb) request.GET

<QueryDict: {u'page': [u'1']}>

4

2 に答える 2

2

フォームのメソッドが の場合GET、ブラウザーが上書きするため、アクションにクエリ文字列を追加できません。フォーム メソッドが の場合にのみ、これを行うことができますPOST

フォームを次のように変更します。

<form method="GET" id="searchForm" action="/search/">
    <input type="text" id="billSearched" name="q_word">
    <input type="submit" value="{% trans "Look for" %}">
</form>

あなたの見解では:

from django.shortcuts import render

def search(request):
    if 'q_word' in request:
        searchTerm = request.GET['q_word']

    found_bills = Bill.objects.filter(name__icontains = searchTerm)
    page = request.GET.get('page')
    paginator = Paginator(found_bills,25)
    try:
        current_page = paginator.page(page)
    except PageNotAnInteger:
        current_page = paginator.page(1)
    except (EmptyPage, InvalidPage):
        current_page = paginator.page(paginator.num_pages)
    # bills_list = list(current_page.object_list) - not needed
    return render(request,
                  'results.html',{"results":current_page,"term": searchTerm})

results.html

{% for bill in results %}
     # .. display bill stuff
{% endfor %}

{% if results.has_previous %}
     <a href="{% url search %}?page={{ results.previous_page_number }}&q_word={{ term }}">previous</a>
{% endif %}

{% if results.has_next %}
      <a href="{% url search %}?page={{ result.next_page_number }}&q_word={{ term }}">next</a>
{% endif %}
于 2012-04-30T17:07:53.020 に答える
1

URL を「説明する」とはどういう意味ですか? あなたの urls.py はうまく見えます。デバッガーをps.views.search()関数にドロップして、関数がヒットしていることを確認しましたか? デバッグ サーバーのログを調べて、ブラウザから正しい URL が要求されていることを確認しましたか?

r'^search/$'ページパラメーターを取得してアクセスするかrequest.GET['page']、パラメーターをビュー関数に渡すことができます。url(r'^search/(?P<page>\d+)/$これは、検索が2つのパラメーターリクエストを受け取り、次にページを取得することを意味します。ページ パラメータを渡す場合は、フォームの URL を次のように変更する必要があります。

<form method="GET" id="searchForm" action="/search/1">

ページをGETパラメータにする代わりに

リストした URL の構文に問題はありません。

https://docs.djangoproject.com/en/1.3/topics/pagination/#using-paginator-in-a-view

を使用している場合はurl(r'^search/(?P<page>\d+)/$'、search が page という名前の変数を 2 番目の引数として受け取ることを確認してください。デバッガーの使い方を学ぶことも重要です。

import pdb; pdb.set_trace()(またはさらに良いipdb!)、それをビューにドロップして、ヒットしているかどうかを確認します。ヒットしていない場合は、devサーバーをチェックして、実際に要求されているURLを確認します。

于 2012-04-30T14:54:32.717 に答える