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

如何通过Flask-Table或JS实现按钮提交整行表单数据?

解决方案:Flask-Table 提交多行数据到后端

好问题!我来给你拆解两种可行的方案——一种是利用Flask-Table的自定义模板能力(原生思路),另一种是用JavaScript动态构建表单提交,两种都能让你在后端通过request.form拿到所需的Classroom、Activity、Fund数据。


方案一:Flask-Table 原生自定义列(推荐)

Flask-Table允许你自定义列的渲染模板,我们可以给每行的「Sign In」按钮套一个专属的表单,把该行的Classroom、Activity、Fund作为隐藏字段嵌入表单,点击按钮时直接提交整个表单,后端就能一次性拿到所有数据。

1. 定义自定义列

在Python代码里,创建一个继承自Col的自定义列,指定它的渲染模板:

from flask_table import Table, Col

class SignInCol(Col):
    # 指定该列使用的Jinja2模板片段
    def td_format(self, item):
        # item是当前行的数据对象,假设它有id、classroom、activity、fund属性
        return f'''
        <form action="/endpoint_to_send_form_to/{item.id}" method="POST">
            <input type="hidden" name="classroom" value="{item.classroom}">
            <input type="hidden" name="activity" value="{item.activity}">
            <input type="hidden" name="fund" value="{item.fund}">
            <button type="submit" class="btn btn-primary">Sign In</button>
        </form>
        '''

# 定义你的表格类
class DataTable(Table):
    id = Col('ID')
    classroom = Col('Classroom')
    activity = Col('Activity')
    fund = Col('Fund')
    # 使用自定义的SignInCol作为最后一列
    sign_in = SignInCol('Action')

2. 后端接收数据

你的原路由不需要大改,直接通过request.form获取隐藏字段的值:

from flask import Flask, request

app = Flask(__name__)

@app.route('/endpoint_to_send_form_to/<int:id>', methods=['POST'])
def handle_sign_in(id):
    classroom = request.form.get('classroom')
    activity = request.form.get('activity')
    fund = request.form.get('fund')
    
    # 这里处理你的业务逻辑,比如更新数据库
    print(f"Received ID: {id}, Classroom: {classroom}, Activity: {activity}, Fund: {fund}")
    return "Sign In successful!"

这种方案完全基于Flask-Table的原生能力,不需要额外引入JavaScript,代码结构更清晰,适合后端主导的开发场景。


方案二:JavaScript 动态构建表单提交

如果你不想修改Flask-Table的列模板,也可以给每个「Sign In」按钮绑定点击事件,通过JS动态生成表单并提交数据。

1. 给按钮添加数据属性

先在Flask-Table的列里,给按钮加上自定义data-*属性,存储该行的关键数据:

class SignInCol(Col):
    def td_format(self, item):
        return f'''
        <button type="button" class="sign-in-btn" 
                data-id="{item.id}"
                data-classroom="{item.classroom}"
                data-activity="{item.activity}"
                data-fund="{item.fund}">
            Sign In
        </button>
        '''

2. 编写JavaScript提交逻辑

在页面的<script>标签里添加以下代码,监听按钮点击事件:

document.addEventListener('DOMContentLoaded', function() {
    const signInButtons = document.querySelectorAll('.sign-in-btn');
    
    signInButtons.forEach(btn => {
        btn.addEventListener('click', function() {
            // 从按钮的data属性中获取数据
            const id = this.dataset.id;
            const classroom = this.dataset.classroom;
            const activity = this.dataset.activity;
            const fund = this.dataset.fund;
            
            // 动态创建表单
            const form = document.createElement('form');
            form.action = `/endpoint_to_send_form_to/${id}`;
            form.method = 'POST';
            
            // 添加隐藏字段
            const createHiddenInput = (name, value) => {
                const input = document.createElement('input');
                input.type = 'hidden';
                input.name = name;
                input.value = value;
                return input;
            };
            
            form.appendChild(createHiddenInput('classroom', classroom));
            form.appendChild(createHiddenInput('activity', activity));
            form.appendChild(createHiddenInput('fund', fund));
            
            // 将表单添加到页面并提交
            document.body.appendChild(form);
            form.submit();
            // 提交后移除表单(可选)
            document.body.removeChild(form);
        });
    });
});

3. 后端接收逻辑和方案一完全一致

同样用request.form.get()获取对应字段的值即可。

这种方案更灵活,适合已经有现成表格结构、不想大幅修改后端列定义的场景。


两种方案都能满足你的需求,你可以根据自己的项目架构和开发习惯来选择~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 20:49:04