【问题标题】:django - what goes into the form action parameter when view requires a parameter?django - 当视图需要参数时,表单操作参数中包含什么?
【发布时间】:2011-07-24 22:38:07
【问题描述】:

这就是我所拥有的:

myview.py 带有一个带有参数user 的视图:

def myview(request, user):
   form = MyForm(request.POST)
   ....
   return render_to_response('template.html',locals(), context_instance=RequestContext(request))

user 通过 url 传递。

urls.py:

...

urlpatterns += patterns('myview.views',
    (r'^(?P<user>\w+)/', 'myview'),
)

...

我还有一个template.html 的表单:

<form name="form" method="post" action=".">
...
</form>

如果myview 函数需要一个参数,那么表单操作参数中的内容是什么?

现在我有 action="." 。我问的原因是因为当我填写表单 In (templates.html) 并单击提交按钮时,我看到绝对没有从该表单传递的字段值。当我单击提交按钮时,这几乎就像我传递了一个空表单。有任何想法吗?谢谢!

【问题讨论】:

    标签: django django-templates django-forms django-views


    【解决方案1】:

    它应该不需要任何东西。假设您在以下网址:

    www.yoursite.com/users/johnsmith/
    

    你的表格应该是:

    <form name="form" method="post" action="">
    

    此时,您已经在myview 中,用户为johnsmith。您的视图应如下所示:

    if request.method == 'POST':
        form = MyForm(request.POST)
        if form.is_valid():
            # you should be able to extract inputs from the form here
    else:
        form = MyForm()
    

    【讨论】:

    • 如果 action 属性为空,某些浏览器(例如最近的 Chrome 版本)将无法发布。
    • @shacker 也许action="." 足以解决 chrome 的问题?
    【解决方案2】:

    如果你想显式设置动作,假设你的模板中有一个变量用户名

    <form name="form" method="post" action="{% url myview.views username %}">
    

    或者您可以在 urls.py 中为 url 指定一个名称,这样您就可以像这样引用它:

    # urls.py
    urlpatterns += patterns('myview.views',
        url(r'^(?P<user>\w+)/', 'myview', name='myurl'), # I can't think of a better name
    )
    
    # template.html
    <form name="form" method="post" action="{% url myurl username %}">
    

    【讨论】:

    • 使用URL模板标签,你需要在URL周围有' '{% url 'myurl' parameter_to_pass %}
    【解决方案3】:

    您正在发布到也为表单提供服务的同一视图。所以首先,视图被调用并服务于表单。当您发布表单时,将调用相同的视图,但这次您处理表单。这就是为什么行动是空的。

    【讨论】:

    • 我会看看这个。说得通。感谢您的回复。
    • 如果是这种情况,我应该怎么做才能避免它?
    • 去掉 action="." 中的点。然后表单将发布到同一视图并进行处理。你想避免什么?如果您想发布到不同的视图,您可以将路径付诸实践,而不是将其留空
    【解决方案4】:

    您可以使用request.path,这在大多数情况下都可以使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 2014-07-02
      • 2019-01-06
      • 2014-08-27
      • 1970-01-01
      • 2016-05-27
      相关资源
      最近更新 更多