假设我有以下毫无意义的示例 View :
def foo(request, input):
return HttpResponse()
在模板中我有一个表单:
<form method="get" action="{% url 'foo' ??? %}">
<input id="myinput" type="text" name="myinput">
...
</form>
最后,我的 URLconf 中有以下 url:
urlpatterns = [
url(r'^foo/(.+)/', views.foo, name='foo'),
]
我想做的是将用户输入的值传递到 ID 为 #myinput 的输入中,然后传递给 foo() View 函数。换句话说,您应该能够在 html 输入中输入 bar,当您提交表单时,它将带您到 foo/bar/。
我知道在 foo View 中我可以使用 request.GET['myinput'] 轻松访问输入的值,但我希望它也显示在 url 中。
这看起来应该是一个相当普遍的任务,但我还没有想出解决方案。任何建议,将不胜感激。我的 Frankenstein's Monster 第一个 Django 站点几乎完成了,这是我缺少的最后一 block 。
请您参考如下方法:
我误解的根源
尽管为了简化我的示例并避免使用特定于应用程序的代码,我没有明确说明这一点,但我的用例是一个简单的搜索 View 。该 View 实际上是我在 Django 之旅开始时写的第一个 View ,我错误地是 POST正在处理我的数据而不是 GET正在处理它。这样一来,如果我正在搜索项目 foo ,它将带我到 foo 的详细信息页面, 但 url 将是 mysite/search/ (即,搜索查询虽然包含在请求中,但未包含在 url 中),我无法通过访问 url mysite/search/ 返回这些搜索结果。 .
当我使用 GET 时在这个问题的玩具示例中请求,我没有意识到我一直在使用 POST在我的应用程序中,通过一些小的调整,我可以非常轻松地免费获得我想要的功能。我知道所有这些对于资深甚至中级 Web 开发人员来说都是非常明显的,但是对于没有 Web 或 CS 经验的从头开始的人来说,像 HTTP 这样的事情。可能有点困惑。至少对我来说是这样。非常感谢@Two-Bit Alchemist 以我能理解的方式解释了这一点。
将所有这些应用到我的玩具示例中
我会在我的 View 中删除传递的参数:
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 所说:“剩下的事情会像变魔术一样发生”。如果用户输入 bar在输入和提交表格时,他们将被带到foo/search/?search_query=bar .这就是我要找的。
