2017-06-21 21 views
0

エラーは発生していません。レコードは更新されていません。私は私が唯一選ばれた少数のフィールドを更新していますので、(私はpopulate_obj()を使用することはできませんが、db.session.commit()た後、それはまだテーブルを更新していないユーザーレコードを編集し、個々のフィールドを保存しています。SQLAlchemyはレコードを更新しません

@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データベースに書き込まれます。

commit()db.session.flush()は違いはありません追加、また前(db.session.add(user))をコミットするセッションにユーザーを追加することはない。

方法D oレコードを更新しますか?

答えて

1

if form.validate_on_submitより前のコードは、フォームが送信されたときに実行されます。そのコードでは、フォームデータをデータベースのデータで上書きしています。

送信されたフォームでユーザーが '[email protected]'から '[email protected]'にメールを変更したように見せます。これは、フォームが有効である場合に実行されるコードですブランチは:フォームがさえ検証される前に

user = User.query.get_or_404(user_id) 
form = EditUserForm() 
form.username.data = user.username 
# at this point form.email.data would be '[email protected]' but.... 
form.email.data = user.email # we then override it with '[email protected]' 
form.first_name.data = user.first_name 
form.last_name.data = user.last_name 
user.email = form.email.data # read '[email protected]' 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")) 

ので[email protected]のデータが破壊されます。したがって、更新すると、すでに保存されている値で更新するだけです。

+0

OKです。リクエストメソッドがGETであった場合はチェックを追加し、最初の場合はフィールドにデータを取り込みます。それから、POSTメソッドでのみ検証します。大体今はうまく動いているようだ。ありがとう! – Dan

関連する問題