Flask表单提交后如何保留textarea中已输入的文本内容?
表单提交后保留textarea输入内容的实现方法
问题本质
提交表单后调用render_template时,没有将用户已提交的文本内容传回前端模板,textarea渲染时无预填充值,重载后自然显示为空。
具体修改方案
1. 调整后端路由逻辑(views.py)
无论GET/POST请求,渲染模板时都要传入textarea对应的填充值:首次GET访问传空字符串,POST提交后传用户刚提交的内容即可。
修正后的代码:
@views.route('/', methods=['GET', 'POST']) def home(): query_content = "" if request.method == 'POST': query_text = request.form.get('query_text', '') # 注意:原代码直接add字符串不符合SQLAlchemy语法要求,需替换为对应模型实例 # 示例:如果存储查询的模型为SearchQuery,内容字段为content,写法为 db.session.add(SearchQuery(content=query_text)) db.session.add(query_text) db.session.commit() query_content = query_text return render_template("home.html", query_content=query_content)
2. 调整前端模板(home.html)
和input标签不同,textarea的默认值需要写在标签闭合前的位置,直接输出后端传入的变量即可,Jinja2默认开启自动转义,无需额外处理XSS风险。
修正后的表单代码:
<form method="POST"> <textarea name="query_text" id="query_text" class="form-control">{{ query_content }}</textarea> <button type="submit" name="submit" class="btn btn-primary">Submit</button> </form>
补充说明
- 如果后续要改成POST后重定向的PRG模式(避免表单重复提交),需要先把提交的
query_text存入session或者flash消息,重定向到GET路由后再取出值传给模板,否则重定向产生的新GET请求无法获取上次POST的表单数据。 - 原代码中
db.session.add(query_text)存在语法问题:SQLAlchemy的add方法仅接收模型类实例,不能直接传入字符串,实际运行会报错,记得替换为对应模型的实例化操作。
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

