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

Flask使用request.form.get获取Jinja循环生成的表单值返回None问题

问题排查与修复方案

核心问题

  • 后端误用Jinja模板语法:{{ }}是仅在HTML模板中生效的插值语法,你在Python代码里写request.form.get("{{value.id}}")相当于查找名称为{{value.id}}字面量的表单字段,自然返回None。
  • 动态字段名无法提前匹配:你给每个复选框设置的name是动态的value.id,不同条目对应的name值不同,后端无法提前预知具体的name值,无法正确匹配字段。
  • 视图缺失返回值触发404:你贴出的recipedata视图函数没有编写返回逻辑,Flask要求所有视图必须返回响应内容,缺失返回会触发服务端异常,部分场景下会返回404状态码。
  • 复选框特性限制:未勾选的复选框不会被提交到后端,此时用request.form.get获取对应字段也会返回None。

修复代码

前端模板修改

将复选框的name固定为统一值,后端可直接通过固定字段名获取提交的id:

{% for value in foodinfo.results %}
<form action="/recipedata" method="POST">
    <input type="checkbox" name="food_id" value="{{value.id}}">
    <input type="text" placeholder="{{value.id}}">
    <input type="submit" value="跳转至食谱信息">
</form>
{% endfor %}

如果需要强制用户勾选复选框后提交,可以给复选框添加required属性:<input type="checkbox" name="food_id" value="{{value.id}}" required>

Flask后端修改

移除Jinja语法,通过固定字段名取值,补全返回逻辑:

@app.route("/recipedata", methods=["GET","POST"])
def recipedata():
    if request.method == 'POST':
        food = request.form.get("food_id")
        # 测试输出可删除
        print("获取到的食物ID:", food)
        # 替换为你需要的业务逻辑,比如跳转、返回页面等
        return f"提交的食物ID为:{food}"
    # GET请求时返回承载表单的页面,替换为你自己的模板和传参即可
    # return render_template("你的模板文件名.html", foodinfo=你的foodinfo数据源)

额外验证方案

如果需要查看所有提交的表单字段,可以在POST逻辑里加一行打印代码,确认提交的字段键值对:

print(request.form.to_dict())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 22:09:01