4

我正在尝试进行简单的搜索并以分页的形式返回结果。每当我尝试转到第二页时,我的搜索词就会丢失,因此我的第二页没有结果。

我在 Djangoproject 教程中找到并遵循了分页示例,但我还没有找到有关如何为搜索视图编写 URL 的示例。

我以前在我的表单中使用过方法,因为当我几乎没有数据要显示时(尽管现在,经过一些研究,我知道和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>

网址.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但没有一个成功。

IE:

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

“描述”您的网址是什么意思?你的 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 参数

对于您列出的任何网址,我认为您的语法没有任何问题。

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

如果您正在使用,请url(r'^search/(?P<page>\d+)/$'确保搜索将名为 page 的变量作为第二个参数。学习如何使用调试器也很重要。

import pdb; pdb.set_trace()(甚至更好的 ipdb!),将其放在您的视图中以查看它是否命中,如果它没有命中,请检查开发服务器以查看实际请求的 url。

于 2012-04-30T14:54:32.717 回答