【问题标题】:WTForms submitting form twice when multiple forms are in the same page当多个表单在同一页面中时,WTForms 提交表单两次
【发布时间】:2015-01-02 02:42:18
【问题描述】:

在我看来,我有几种不同的形式。在一个中,您输入要搜索的名字和姓氏。如果有结果,页面会刷新,用于选择用户的第二个表单会显示为表格,单击一行会提交该行的数据。出于某种原因,提交第二个表单会导致为每个字段提交两个值:一个完全为空,另一个包含正确的信息。

我有一些 javascript 会在点击表格中的一行时执行。它应该用表格中的数据填写并提交一个隐藏的表格。我遇到的问题是提交表单时,提交了两组值。表单提交后的 request.form 包含以下内容:

ImmutableMultiDict([('csrf_token', u'1420171907##6ad5346730985191250a52e6432e924ef05c23ee'), ('last_name', u''), ('last_name', u'Smith'), ('first_name', u''), ('first_name', u'John')])

这是脚本:

$('table#theTable tr').click(function () {
var cells = this.getElementsByTagName('td');
$('#selectuser_last_name').val(cells[0].innerHTML);
$('#selectuser_first_name').val(cells[1].innerHTML);
document.selectuser.submit();
});

下面是与之配套的 HTML:

<table id="theTable">
    <thead>
        <tr>
            <th>Last</th>
            <th>First</th>
        </tr>
    </thead>
    <tbody>
        {% for user in users %}
            <tr>
                <td>{{ user.last_name }}</td>
                <td>{{ user.first_name }}</td>
            </tr>
        {% endfor %}
    </tbody>
</table>
<form id=selectUserForm action="/handle_users" method="post" name="selectuser">
    {{ forms.selectuser.hidden_tag() }}
    {{ forms.selectuser.last_name(id="selectuser_last_name") }}
    {{ forms.selectuser.first_name(id="selectuser_first_name") }}
    <input type="submit">Test</input>
</form>

我正在使用 Python 和 Flask 来处理发布的任何内容。

【问题讨论】:

    标签: javascript python flask wtforms flask-wtforms


    【解决方案1】:

    您似乎实际上提交了两次——一次是在表单中没有任何内容之前,一次是在填充之后(后者通过 javascript,前者通过表单提交机制)。

    如果用户并没有真正在表单中输入任何内容,但这是在任何时候单击一行时对服务器的简单调用。跳过整个表格,它在这里没有帮助。只需使用您需要的信息将调用传递给服务器 - 可以是一个简单的 ajax 帖子:

     $('table#theTable tr').click(function () {
       var cells = this.getElementsByTagName('td');
       $.ajax({ 
            type : "POST",
            url : "/handle_users",
            async:true,
            contentType : 'application/json;charset=UTF-8',
            data: JSON.stringify({first_name:cells[0].innerHTML,last_name:cells[1].innerHTML}, null, '\t'),
            success : function(data) {
                // optional: do something when server-side processing is done 
            }
        });
    });
    

    然后在 /handle_users 路由中使用 request.get_json() 从烧瓶中获取数据。

    【讨论】:

    • 不错!但是你如何进行验证? WTForms 让这一切变得简单。
    • @PearSquirrel,如果它解决了您提出的问题,请接受答案。更重要的是,如果没有用户输入,只需单击一行,检查表中的数据。例如,您可以有条件地对有效行和无效行进行不同的着色,并使无效行处于非活动状态(“不可点击”)。有许多 jquery 表插件可以对表、ajax、jquery 等进行更复杂的工作。我成功使用了 DataTables(参见 DataTables.net)。
    猜你喜欢
    • 2014-03-23
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多