如何在Django中描述URL - 仍然需要一个答案

时间:2012-04-30 14:40:55

标签: python django forms url get

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

我已经找到并关注了Djangoproject教程中的Pagination示例,但我没有找到有关如何为搜索视图编写URL的示例。

我以前在我的表单中使用过POST方法,因为我的数据很少(尽管现在,经过一些研究,我知道GET和{{之间的使用差异1}})。当我获得更多数据时,我被限制使用分页。因此,我已将表单方法更改为POST,但这是我的问题,我不知道如何描述我的GET,因此数据会发送到正确的视图。

我试图让它与URL一起使用,但没有成功。最后,我决定坚持POST示例,但偶然发现了这个让我回头的网址。

以下是模板和URL文件中的代码:

search.py​​:

GET

urls.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>

我为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")

更新#2:

如果我使用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)) ,我可以看到没有数据从客户端传递到服务器。必须努力,但仍然,任何信息和/或提示将非常感激,因为他们可以缩短我的搜索时间:))

pdb

(Pdb) request.GET

2 个答案:

答案 0 :(得分: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 %}

答案 1 :(得分: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。