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

Flask项目中adminapp.py向inputdataform.html传值失效问题求助

Flask路由向模板传值渲染下拉框失败问题解决方案

核心问题原因

  • 你代码中db.row_factory = sql.Row配置处于注释状态:sqlite3默认执行fetchall()返回的是嵌套元组结构,不支持row.num、row.subject这类点属性访问语法,模板取值失败导致没有渲染选项。
  • 次要排查点:数据库文件路径错误,程序运行时找不到mailstudy.db导致查询返回空列表;或是tb_subject表未成功插入测试数据。

修复方案

方案一:开启行工厂配置(推荐,代码可读性更高)

取消路由代码中db.row_factory = sql.Row的注释,同时补充数据库绝对路径定位、数据库连接关闭逻辑,修改后路由代码如下:

@app.route('/inputdataform')
def inputdata():
    # 用绝对路径定位数据库,避免运行工作目录变动导致找不到库文件
    import os
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))
    db_path = os.path.join(BASE_DIR, "mailstudy.db")
    db = sql.connect(db_path)
    # 取消下行注释,开启行工厂,支持键名访问字段
    db.row_factory = sql.Row
    cursor = db.cursor()

    cursor.execute("SELECT * FROM tb_subject")
    subject = cursor.fetchall()
    cursor.close()
    db.close() # 补充关闭数据库连接,避免资源泄漏

    return render_template('inputdataform.html', rows=subject)

该方案无需修改原有模板代码,row.num、row.subject可正常生效。

方案二:适配元组取值,无需修改路由

如果不想调整路由代码,可以直接修改模板,按元组下标访问字段(你查询顺序是SELECT *,第一个字段对应num,第二个对应subject),模板修改后代码如下:

<html>
  <body>
    <form action="{{url_for('inputdata')}}" method="POST">
      <h3>Problem Input</h3>
      Subject : <select name="subject">
                {% for row in rows %} 
                  <option value="{{row[0]}}">{{row[1]}}</option>
                {% endfor %}  
                </select><br>
      
    </form>
  </body>
</html>

额外排查步骤

如果修改后仍无选项渲染,可按下面步骤排查:

  1. 本地运行时在路由中添加打印语句print(subject),查看控制台输出的查询结果是否为空
  2. 确认inputdataform.html文件放在项目根目录的templates文件夹下,符合Flask默认模板加载规则
  3. 打开mailstudy.db确认tb_subject表中确实存在你插入的4条测试数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:09:03