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>
额外排查步骤
如果修改后仍无选项渲染,可按下面步骤排查:
- 本地运行时在路由中添加打印语句
print(subject),查看控制台输出的查询结果是否为空 - 确认
inputdataform.html文件放在项目根目录的templates文件夹下,符合Flask默认模板加载规则 - 打开
mailstudy.db确认tb_subject表中确实存在你插入的4条测试数据
内容的提问来源于stack exchange,提问作者Heuido Kim
相关产品推荐
相关产品推荐

