2011-08-03 57 views
1

我打算由Django編寫一個搜索應用程序。
當我重定向到結果頁面時,出現NoReverseMatch錯誤。
我張貼在這裏我的代碼http://pastebin.com/AL4rG9NUNoReverseMatch錯誤,同時重定向到結果頁

或者你可以在下面

urls.py

urlpatterns = patterns('pylucene.views', 
    (r'^$', 'index'), 
    (r'^search/$', 'search'), 
) 

views.py

def index(request): 
    return render_to_response('pylucene/index.html', context_instance=RequestContext(request)) 


def search(request): 
    query = request.POST['query'] 
    search_results = search_files(query) 
    return HttpResponseRedirect(reverse('pylucene.views.results', args=(search_results,))) 

的錯誤閱讀:

NoReverseMatch at /pylucene/search/ 
Reverse for 'pylucene.views.results' with arguments 
'([(u'Documents\\Dieu khien may tinh bang y nghi.txt', u'Dieu khien 
may tinh bang y nghi.txt'), '1 total matching documents.'],)' and 
keyword arguments '{}' not found.
def results(request, search_results): 
return render_to_response('pylucene/results.html', {'search_results': search_results}, context_instance=RequestContext(request)) 

我看了幾個類似的話題,但我解決不了我的問題。 請幫幫我。
非常感謝。

回答

3

我認爲你不能確定reverse函數是如何工作的,你試圖做什麼只是不可能的。

您提供的網址必須在urls.py聲明例如反向功能:

#urls.py: 
urlpatterns = patterns('blog.views', 
    (r'^$', 'index'), 
    url(r'^blog/(?P<slug>\d{4})/$', 'blog', name="blog-detail"), 
) 

現在在你的代碼,你可以做

reverse('blog-detail', args=('django-urls',)) 
# the resolt of this is 
# /blog/django-urls/ 

這該是多麼的反向工程。


真正的答案

我認爲你不需要2次,但如果你真的想:你這樣做是爲了通過所有查詢已執行

def search(request): 
    query = request.POST['query'] 
    search_results = search_files(query) 
    return results(request, search_results) 

但我認爲你可以做的最好的是(使用GET):

def search(request): 
    query = request.GET['query'] # I think using get is better because you are GETing info 
    search_results = search_files(query) # better if returns a generator 
    return render_to_response('pylucene/results.html', 
           {'search_results': search_results}, 
           context_instance=RequestContext(request) 
+0

謝謝sacabuche。所以,我有個問題要問你。我閱讀了Django的教程https://docs.djangoproject.com/zh/dev/intro/tutorial04/,並且此文檔說「在成功處理POST數據後,應始終返回HttpResponseRedirect」 爲什麼只使用render_to_response而沒有HttpResponseRedirect? 非常感謝你 –

+0

@chuot你是completyli rigth,我完全錯過了,但也許這[其他問題](http://stackoverflow.com/questions/46585/when-do-you-use-post-and-當你使用得到)將解釋爲什麼我認爲這是GET而不是POST。這裏重要的是爲什麼我們應該使用HttpResponseRedirect,原因是因爲您修改了某些內容,而您不希望這發生兩次。 (我的代碼被修改) – sacabuche

+0

我閱讀了你的建議。我認爲我的應用程序應該使用GET而不是POST,因爲它只是檢索沒有更改數據的信息。感謝sacabuche。 –