我没有收到任何错误,它只是没有更新记录。我正在修改用户记录并保存单个字段(我无法使用populate_obj()
因为我只更新了一些选定的字段,但在db.session.commit()
之后,它仍然不会更新表格。
@app.route("/user/edit/<int:user_id>", methods=["GET", "POST"])
@login_required
def edit_user(user_id):
user = User.query.get_or_404(user_id)
form = EditUserForm()
form.username.data = user.username
form.email.data = user.email
form.first_name.data = user.first_name
form.last_name.data = user.last_name
if form.validate_on_submit():
user.email = form.email.data
user.first_name = form.first_name.data
user.last_name = form.last_name.data
db.session.commit()
flash("Updated user '{}'".format(user.username))
return redirect(url_for("user"))
return render_template("user_edit_form.html", form=form, action="Edit", user_id=user_id)
它甚至会重定向闪存更新记录的消息,但sqlachemy没有将任何内容写入mysql数据库。
在db.session.flush()
之后添加commit()
没有任何区别,也没有在提交之前将用户添加到会话(db.session.add(user)
)。
如何更新记录?
答案 0 :(得分:2)
请记住,if form.validate_on_submit
之前的代码在提交表单时仍然执行 - 并且在该代码中,您将使用数据库中的数据覆盖表单数据。
让我们假装用户已经从'old@foo.com'更改了他们的电子邮件;到&#39; new@foo.com'在提交的表单上 - 如果我们在表单中删除了有效的分支,这将是执行的代码:
user = User.query.get_or_404(user_id)
form = EditUserForm()
form.username.data = user.username
# at this point form.email.data would be 'new@foo.com' but....
form.email.data = user.email # we then override it with 'old@foo.com'
form.first_name.data = user.first_name
form.last_name.data = user.last_name
user.email = form.email.data # read 'old@foo.com' from the data (since we over-rode it above)
user.first_name = form.first_name.data
user.last_name = form.last_name.data
db.session.commit().
flash("Updated user '{}'".format(user.username))
return redirect(url_for("user"))
因此,在对表单进行验证之前,new@foo.com
数据将被销毁。因此,当您更新时,您只需使用已存储的值进行更新。