我们说我有以下毫无意义的示例视图:
def foo(request, input):
return HttpResponse()
在模板中我有一个表单:
<form method="get" action="{% url 'foo' ??? %}">
<input id="myinput" type="text" name="myinput">
...
</form>
最后,我在URLconf中有以下网址:
urlpatterns = [
url(r'^foo/(.+)/', views.foo, name='foo'),
]
我想要做的是将用户输入的值传递到id为#myinput
的输入到foo()
视图功能。换句话说,您应该可以在html输入中输入bar
,当您提交表单时,它会转到foo/bar/
。
我知道在foo视图中我可以使用request.GET['myinput']
轻松访问输入的值,但我希望它也显示在url中。
这似乎应该是一项相当普遍的任务,但我还没有找到解决方案。任何建议,将不胜感激。我的弗兰肯斯坦的第一个Django网站的怪物几乎完成了,这是我遗失的最后一块。
答案 0 :(得分:6)
虽然为了简化我的示例并避免使用特定于应用程序的代码,我没有说清楚,但我的用例是一个简单的搜索视图。这个视图实际上是我在Django旅程开始时写的第一个视图之一,我错误地POST
我的数据而不是GET
。这样做是为了在我搜索foo
项时,我会转到foo
的详细信息页面,但网址为mysite/search/
(即搜索查询)虽然它已包含在请求中,但未包含在网址中,并且我无法通过访问网址mysite/search/
返回搜索结果。
虽然我在这个问题的玩具示例中使用了GET
请求,但我没有意识到我在我的应用中使用了POST
,并且稍微调整了一下我可以很容易地免费获得我想要的功能。我知道所有这一切对于经验丰富的甚至是中级Web开发人员来说都是非常明显的,但对于从头开始没有Web或cs经验的人来说,像HTTP
这样的事情可能会有点混乱。至少对我而言。非常感谢@ Two-Bit Alchemist以我能理解的方式解释这一点。
我会在我的视图中删除传递的参数:
def foo(request):
# If I want to do something with the search query, I can access it with
# request.GET['search_query']
return HttpResponse()
将我的模板中的表单更改为:
<form method="get" action="{% url 'foo' %}">
<input id="myinput" type="text" name="search_query">
...
</form>
并将我的网址更改为:
urlpatterns = [
url(r'^foo/search/', views.foo, name='foo'),
]
正如@ Two-Bit Alchemist所说:&#34;其余的将像魔术一样发生&#34;。如果用户在输入中输入bar
并提交表单,则会将其转到foo/search/?search_query=bar
。这就是我想要的。