2012-04-30 36 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

相关问题