将<input />值传递给Django视图

时间:2016-06-01 18:16:07

标签: python django

我们说我有以下毫无意义的示例视图:

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网站的怪物几乎完成了,这是我遗失的最后一块。

1 个答案:

答案 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。这就是我想要的。