2012-04-30 34 views
4

我試圖做一個簡單的搜索並返回分頁形式的結果。每當我嘗試去第二頁時,我的搜索詞都會丟失,因此我的第二頁沒有結果。如何在Django中描述URL - 仍然需要一個答案

我發現並遵循Djangoproject教程中的Pagination示例,但是我還沒有找到關於如何爲搜索視圖編寫我的URL的示例。我已經在我的表單中使用過POST方法,因爲當我只有很少的數據可以顯示時(雖然現在經過一些研究,我知道GETPOST之間的使用差異)。當我獲得更多數據時,我被限制使用分頁。因此,我已將表單方法更改爲GET,但這是我的問題,我不知道如何描述我的URL,以便將數據發送到正確的視圖。

我試圖使它與POST一起工作,但沒有成功。最後我決定堅持使用GET的例子,但是偶然發現了這個讓我失望的URL。

這裏是模板代碼和文件的URL:

search.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")

任何解釋/解決方案將非常感激。先謝謝你!

UPDATE:

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']}>

+1

您可以刪除 「{%csrf_token%}」 了。它僅用於POST請求。 – rantanplan

+0

感謝提示:) –

+0

相關:http://stackoverflow.com/a/1116026/781695 – Medorator

回答

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 %} 
+0

我很抱歉說這個,但它不起作用。它表示'在分配之前引用局部變量'searchTerm''。如果我添加一個簡單的else語句並聲明變量'searchTerm',那麼我會爲'page'值得到一個錯誤,並說它是'NoneType'。我猜測變量不是在HTTP請求中發送的,但爲什麼?代碼似乎沒問題。 –

+0

我已經使用'pdb'來查看HTTP請求的樣子,GET字典是空的。我不知道變量在哪裏.. –

+0

這是說,因爲你的邏輯沒有考慮到什麼時候提交一個空表格 - 我只更新了你的代碼中與分頁有關的部分。 –

1

你是什麼意思「描述」你的網址?你的urls.py看起來很好。您是否將調試器放入您的ps.views.search()函數中以確認它正在擊中?你看過你的調試服務器日誌以確保從瀏覽器請求正確的URL嗎?

你可以有r'^search/$'並訪問頁面作爲PARAM或request.GET['page']你可以在參數傳遞給像url(r'^search/(?P<page>\d+)/$您的視圖功能,這意味着搜索將需要2個PARAMS請求,然後頁面。如果傳遞您需要更改頁面PARAM表單網址是

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

而不必頁面是一個GET PARAM

我看不出有什麼毛病你的語法的任何URL的你已列出。

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

如果您正在使用url(r'^search/(?P<page>\d+)/$'確保搜索需要一個名爲頁面變量作爲第二個參數。學習如何使用調試器也很重要。

import pdb; pdb.set_trace()(或者甚至更好的ipdb!),把它放在你的視圖中看看它是否打了,如果它沒有打開檢查dev服務器來查看實際請求的是什麼url。

+0

當我說描述我的意思是我的'URL'應該怎麼樣? 'url(r'^ search /(here's here?)','ps.views.search')' –

+0

感謝您的提示。我會試試看。 –

+0

@reos,你可以有'r'^ search/$''並以'request.GET ['page']'的形式訪問'page'參數,或者你可以傳遞參數給你的視圖函數,比如'url r'^ search /(?P \ d +)/ $'這意味着搜索需要2個參數'request'然後是'page'。我沒有看到你的語法的任何錯誤 – dm03514

相關問題