【问题标题】:Pass <input> value to Django view将 <input> 值传递给 Django 视图
【发布时间】:2016-06-01 18:16:06
【问题描述】:

假设我有以下毫无意义的示例视图:

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'),
]

我想做的是将用户输入的值传递给#myinput id 的输入到foo() 视图函数。换句话说,您应该可以在html输入中输入bar,当您提交表单时,它会带您到foo/bar/

我知道在 foo 视图中,我可以使用 request.GET['myinput'] 轻松访问输入的值,但我也希望它显示在 url 中。

这似乎应该是一个相当普遍的任务,但我还没有想出一个解决方案。任何建议,将不胜感激。我的第一个 Django 站点的科学怪人怪物几乎完成了,这是我遗漏的最后一部分。

【问题讨论】:

  • 您确定要这样做吗?您必须使用非常通用的正则表达式定义一个视图以将它们转发到,这将阻止您在foo/ 下放置几乎任何其他内容。
  • 即使在 REST 接口中,构造这样的 URL 也是非常不寻常的。拥有类似items/search/?search_query=nameofitem 的东西更为常见
  • 如果您只是将{% url 'foo' %} 与 GET 操作一起使用,它将自动发生。
  • 使用没有??? 的内容并将name="myinput" 更改为name="search_query"。其余的将像魔术一样发生:D
  • @elethan 我可以这样做,但是您的问题正文中已经有了很好的答案。从 UPDATE 中取出部分并将其移至答案。你可以接受你自己的。我宁愿支持你的,也不愿抄袭它。

标签: python django


【解决方案1】:

我误会的根源

虽然为了简化示例并避免使用特定于应用程序的代码,我没有明确说明这一点,但我的用例是一个简单的搜索视图。该视图实际上是我在 Django 旅程开始时编写的第一个视图,我错误地是 POSTing 我的数据而不是 GETing 它。这样做是为了如果我正在搜索项目 foo,它会将我带到 foo 的详细信息页面,但 url 将是 mysite/search/(即,搜索查询不包含在 url虽然它包含在请求中),我无法通过访问 url 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 所说:“其余的将像魔术一样发生”。如果用户在输入中输入bar 并提交表单,他们将被带到foo/search/?search_query=bar。这就是我一直在寻找的。

【讨论】:

    猜你喜欢
    • 2013-07-29
    • 2021-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2011-04-27
    相关资源
    最近更新 更多