Flask SQLAlchemy执行db.session.commit后User表未更新问题求助
问题修复方案
核心错误原因
你遇到的数据库不更新问题由两个逻辑错误共同导致:
- 预填充表单的逻辑没有区分请求方法:不管是GET还是POST请求,你都会先用数据库存储的旧值覆盖表单字段的
data属性,POST请求携带的用户修改后的新值直接被旧值替换,最终提交到数据库的还是原始数据 - 表单验证方法调用错误:
validate_on_submit是WTForms提供的实例方法,必须加()调用才能执行校验逻辑,你当前写法是直接判断方法对象本身,永远返回真值,不会实际做表单校验
修复后的路由代码
@admin.route('/admin/edituser/<int:id>', methods=['GET', 'POST']) @login_required def edituser(id): if not current_user.is_admin: return redirect(url_for('store.viewstore')) user_query = User.query.filter_by(id=id).first_or_404() edituserform = EditUserForm(request.form, obj=user_query) if edituserform.validate_on_submit(): # 直接用表单的新值更新用户实例 user_query.email = edituserform.email.data user_query.first_name = edituserform.first_name.data user_query.last_name = edituserform.last_name.data user_query.is_admin = edituserform.is_admin.data user_query.company_name = edituserform.company_name.data db.session.commit() flash('User has been updated') return redirect(url_for('admin.adminusers')) # 仅GET请求时WTForms会自动通过obj参数预填充表单,不需要手动逐个字段赋值 return render_template('/admin/edituser.html', title='Edit User', edituserform=edituserform, user_query=user_query)
补充说明
- 你尝试的
db.session.add()、db.session.merge()不需要额外调用:user_query是通过SQLAlchemy查询出来的实例,默认已经被当前session托管,修改属性后直接执行commit即可生效 db.session.append是错误用法,SQLAlchemy的session对象本身没有append方法,不需要调用- 优化点:实例化表单的时候直接传入
obj=user_query,WTForms会自动把对应属性的值赋值给表单字段,不需要手动逐个给edituserform.xxx.data赋值,代码更简洁也不会出错
内容的提问来源于stack exchange,提问作者Pixelope
相关产品推荐
相关产品推荐

