Python 如何在Django中描述URL-仍然需要答案
我正在尝试进行简单的搜索,并以分页的形式返回结果。每当我试图转到第二页时,我的搜索词就会丢失,因此我的第二页没有结果 我已经在Djangoproject教程中找到并遵循了这个示例,但是我还没有找到一个关于如何为搜索视图编写URL的示例 我以前在表单中使用过Python 如何在Django中描述URL-仍然需要答案,python,django,forms,url,get,Python,Django,Forms,Url,Get,我正在尝试进行简单的搜索,并以分页的形式返回结果。每当我试图转到第二页时,我的搜索词就会丢失,因此我的第二页没有结果 我已经在Djangoproject教程中找到并遵循了这个示例,但是我还没有找到一个关于如何为搜索视图编写URL的示例 我以前在表单中使用过POST方法,因为当时我几乎没有数据可显示(尽管现在,经过一点研究,我知道GET和POST之间的用法差异)。当我获得更多的数据时,我不得不使用分页。因此,我将表单方法更改为GET,但我的问题是,我不知道如何描述我的URL,因此数据被发送到正确的
POST
方法,因为当时我几乎没有数据可显示(尽管现在,经过一点研究,我知道GET
和POST
之间的用法差异)。当我获得更多的数据时,我不得不使用分页。因此,我将表单方法更改为GET
,但我的问题是,我不知道如何描述我的URL
,因此数据被发送到正确的视图
我曾尝试使用POST
,但没有成功。最后,我决定坚持使用GET
示例,但无意中发现了这个让我望而却步的URL
以下是模板和URL文件中的代码:
search.py:
我已经尝试了多种形式的URL
,但都没有成功
i、 e:
url(r'^search/(?p\d+)/$,'ps.views.search',name=“search”)
url(r'^search/,'ps.views.search',name=“search”)
url(r'^search/(?P\d+)/(?P\w*),'ps.views.search',name=“search”)
任何解释/解决方案都将不胜感激。提前谢谢你
更新:
更新#2:
如果我使用pdb
,我可以看到没有数据从客户端传递到服务器。我已经开始努力了,但是,任何信息和/或提示都将非常感谢,因为它们可以缩短我的搜索时间:)
(Pdb)请求。获取
你所说的“描述”你的url是什么意思?你的url.py看起来不错。您是否将调试器放入ps.views.search()
函数以验证它是否正在运行?您是否查看了调试服务器日志以确保从浏览器请求了正确的url
您可以使用r'^search/$”
并以请求的形式访问页面参数。获取['page']
,或者您可以将参数传递到视图函数,如url(r'^search/(?p\d+)/$
,这意味着搜索需要2个参数请求,然后是页面。如果传递页面参数,则需要将表单url更改为
<form method="GET" id="searchForm" action="/search/1">
而不是让page成为GET参数
我看不出您列出的任何URL的语法有任何错误
如果使用的是url(r'^search/(?p\d+)/$”
,请确保search将名为page的变量作为第二个参数。了解如何使用调试器也很重要
导入pdb;pdb.set_trace()
(或者更好的ipdb!),将其放到视图中,查看其是否命中,如果未命中,请检查开发服务器以查看实际请求的url。如果表单的方法是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>
在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 %}
{%用于结果中的账单%}
#…显示账单内容
{%endfor%}
{%if results.has_previous%}
{%endif%}
{%if results.has_next%}
{%endif%}
当我说descripe时,我的意思是我的URL
应该是什么样子?URL(r'^search/(这里还有什么?),'ps.views.search')
谢谢你的提示。我会尝试一下。@reos,你可以使用r'^search/$”
并访问页面参数作为请求。获取['page']
或者您可以将参数传递给查看函数,如url(r'^search/(?P\d+)/$
这意味着搜索将使用两个参数request
,然后使用page
。我没有发现您列出的任何VEEW的语法有任何错误。我添加了search.py
,以防止其他问题的发生。显然,我选择了简单视图,并尝试使用requee访问数据st.GET['q_word'],但我在
pdb`output(pdb)请求中得到了它。GET['q_word']***多值dictKeyError:“在”
中找不到键'q_word',您可以删除“{%csrf\u token%”现在。它仅用于POST请求。相关:很抱歉,它不起作用。它说局部变量“searchTerm”在赋值之前引用了。如果我添加一个简单的else语句并声明变量searchTerm
,那么页面的值会出现错误,并表示它是非eType
。我猜变量没有在HTTP请求中发送,但是为什么呢?代码似乎没有问题。我使用了pdb
来查看HTTP请求的外观,而GET字典是空的。我不知道变量去了哪里。这是因为您的逻辑没有考虑用户提交空表单的时间-我只是更新了代码中与分页有关的部分。但是为什么GET请求中没有发送数据?我知道我视图中的逻辑“失败”,但那是因为没有发送数据。有什么想法吗?我刚刚结束了另一篇文章,提出了一个关于此问题的问题。
<form method="GET" id="searchForm" action="/search/1">
<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})
{% 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 %}