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

Flask中Request.form无法获取动态命名复选框字段问题

Flask动态复选框表单提交后无法获取字段值问题

在Flask中提交包含多个动态命名复选框的表单,字段命名符合预期,但使用request.form.get()通过动态名称获取表单信息时始终返回None,提交后的request.form字典中不存在这些字段名称。

HTML代码

<form action="{{url_for('main.updatealleles', id=fish.id)}}" method="post">
    <div id="updateAllelesBlock">
        <table id="alleleTable" style="margin: auto; margin-top:20px;">
            <tr>
                <th>Name</th>
                <th>Unidentified</th>
                <th>Identified</th>
                <th>Heterozygous</th>
                <th>Homozygous</th>
                <th>Hemizygous</th>
            </tr>
            {%for allele in alleles%}
                <tr>
                    <th>{{allele.name}}</th>
                    <td><input type="checkbox" name = {{allele.name.replace(" ", "")+"Unidentified"}}></td>
                    <td><input type="checkbox" name = {{allele.name.replace(" ", "")+"Identified"}}></td>
                    <td><input type="checkbox" name = {{allele.name.replace(" ", "")+"Heterozygous"}}></td>
                    <td><input type="checkbox" name = {{allele.name.replace(" ", "")+"Homozygous"}}></td>
                    <td><input type="checkbox" name = {{allele.name.replace(" ", "")+"Hemizygous"}}></td>
                </tr>
            {%endfor%}
        </table>
    </div>
    <button type="submit" class="btn btn-secondary" style="margin-top: 10px;">Update</button>
</form>

Python后端代码

@bp.route("/fish/<id>/updatealleles/", methods=["GET", "POST"])
@login_required
def updatealleles(id):
    fish = Fish.query.filter_by(id=id).first_or_404()
    alleles = Allele.query.filter_by(fish=fish).all()

    if request.method == "POST":
        for allele in alleles:
            print(request.form.get(f"{allele.name.replace(' ', '')}Unidentfied"), file=sys.stderr)
            print(request.form.get(f"{allele.name.replace(' ', '')}Identfied"), file=sys.stderr)
            # THIS IS ALWAYS PRINTING NONE, SAME WITH ALL OTHER FIELDS

            # therefore these, and the other fields are being set to None rather than true/false
            allele.unidentified = request.form.get(f"{allele.name.replace(' ', '')}Unidentified")
            allele.identified = request.form.get(f"{allele.name.replace(' ', '')}Identified")

        db.session.commit()

            return redirect(url_for("main.updatealleles", id=fish.id))
    
        

    return render_template('updatealleles.html', fish=fish, alleles = alleles, title = "Update Alleles")

问题原因及修复方案

1. HTML字段属性缺少引号

HTML中input的name属性未加双引号,浏览器解析时可能无法正确识别字段名称。修改所有复选框的name属性,添加双引号:

<td><input type="checkbox" name="{{allele.name.replace(' ', '')}}Unidentified"></td>
<td><input type="checkbox" name="{{allele.name.replace(' ', '')}}Identified"></td>
<td><input type="checkbox" name="{{allele.name.replace(' ', '')}}Heterozygous"></td>
<td><input type="checkbox" name="{{allele.name.replace(' ', '')}}Homozygous"></td>
<td><input type="checkbox" name="{{allele.name.replace(' ', '')}}Hemizygous"></td>

2. Python代码拼写错误

后端代码中存在拼写错误:Unidentfied、Identfied少了字母i,导致字段名称不匹配。修正为正确的Unidentified、Identified:

print(request.form.get(f"{allele.name.replace(' ', '')}Unidentified"), file=sys.stderr)
print(request.form.get(f"{allele.name.replace(' ', '')}Identified"), file=sys.stderr)

3. 复选框状态判断逻辑错误

未勾选的复选框不会被提交到后端,因此不能直接用request.form.get()判断状态。改用字段名是否存在于request.form中来判断是否勾选:

allele.unidentified = f"{allele.name.replace(' ', '')}Unidentified" in request.form
allele.identified = f"{allele.name.replace(' ', '')}Identified" in request.form
allele.heterozygous = f"{allele.name.replace(' ', '')}Heterozygous" in request.form
allele.homozygous = f"{allele.name.replace(' ', '')}Homozygous" in request.form
allele.hemizygous = f"{allele.name.replace(' ', '')}Hemizygous" in request.form

4. 代码缩进错误

后端代码中return redirect(...)的缩进错误,会导致循环第一次执行后就直接返回,无法处理所有Allele对象。调整缩进至与db.session.commit()同级:

if request.method == "POST":
    for allele in alleles:
        # 处理每个Allele的逻辑
    db.session.commit()
    return redirect(url_for("main.updatealleles", id=fish.id))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 09:24:25