我正在尝试进行简单搜索并以分页形式返回结果。每当我尝试转到第二页时,我的搜索字词都会丢失,因此我的第二页没有结果。
我已经找到并关注了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
答案 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。