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
相关产品推荐
相关产品推荐

