You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过JavaScript事件监听器将表单数据传递给Flask-WTF?

问题根源

你遇到的核心问题是:手动调用form.submit()时,浏览器不会自动将触发提交的按钮(即你的delete按钮)的name和value包含到表单数据中。request.form.get("delete")能拿到值,大概率是你之前通过按钮默认点击提交测试的结果,但JS手动提交时没带上这个按钮的参数,导致WTForms无法解析到form.delete.data。

解决办法

方法1:手动添加隐藏字段传递delete值

在表单中新增隐藏input,JS确认提交时将原按钮的value赋值给它,让WTForms能正常读取数据:

  1. 修改HTML表单:
<form method="POST">
  <!-- 其他表单字段 -->
  <input type="hidden" name="delete" id="delete_hidden">
  <button type="submit" name="delete" value="delete_value" onclick="confirm_delete_submit(event)">删除</button>
</form>
  1. 更新JS代码:
function confirm_delete_submit(event) {
  event.preventDefault()

  modbox.confirm({
    title: 'Confirm delete',
    center: true,
    body: 'Do you want to delete this question?',
    okButton: {
      label: 'Delete',
      size: 'sm'
    },
    closeButton: {
      label: 'Cancel',
      size: 'sm'
    }
  })
  .then(() => {
    // 将原按钮的value赋值给隐藏字段
    document.getElementById('delete_hidden').value = event.target.value;
    // 提交表单
    event.target.form.submit(); 
  })
  .catch(() => console.log('No delete'));
}

方法2:触发按钮click事件代替直接提交表单

这种方式更贴近浏览器默认提交逻辑,会自动带上按钮的name和value:
修改JS的then回调部分,同时添加标记避免重复触发模态框:

function confirm_delete_submit(event) {
  // 若已确认过,直接放行提交
  if (event.target.dataset.confirmed) {
    return;
  }

  event.preventDefault()

  modbox.confirm({
    title: 'Confirm delete',
    center: true,
    body: 'Do you want to delete this question?',
    okButton: {
      label: 'Delete',
      size: 'sm'
    },
    closeButton: {
      label: 'Cancel',
      size: 'sm'
    }
  })
  .then(() => {
    // 标记已确认,防止再次弹出模态框
    event.target.dataset.confirmed = true;
    // 触发原按钮的click事件,执行默认提交逻辑
    event.target.click();
  })
  .catch(() => {
    console.log('No delete');
    // 取消确认标记
    delete event.target.dataset.confirmed;
  });
}

方法3:检查WTForms表单类配置

确保你的WTForms表单类正确定义了delete字段,并且视图中正确实例化:

  1. 表单类示例:
from wtforms import Form, SubmitField

class YourForm(Form):
    # 其他表单字段...
    delete = SubmitField('Delete')
  1. 视图函数示例:
form = YourForm(request.form)
if form.validate_on_submit():
    delete_value = form.delete.data
    # 执行删除逻辑

内容的提问来源于stack exchange,提问作者Bill

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:20:33