2017-06-21 3 views
0

Ich bekomme keine Fehler, es aktualisiert nur nicht den Datensatz. Ich bin die Bearbeitung des Benutzerdatensatzes und Speicher einzelne Felder (I nicht populate_obj() verwenden kann, weil ich nur ein paar ausgewählten Felder zu aktualisieren, aber nach db.session.commit(), es immer noch nicht in die Tabelle aktualisieren.SQLAlchemy nicht Datensatz aktualisieren

@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) 

Es gibt sogar Umleitungen blinkt die Nachricht, die es den Datensatz, aber nichts wird aktualisiert, um die mySQL-Datenbank von Sqlalchemy geschrieben.

Hinzufügen db.session.flush() nach commit() keinen Unterschied macht, noch auf die Sitzung nicht das Hinzufügen Benutzer vor dem Festschreiben (db.session.add(user)).

Wie d o Ich aktualisiere den Datensatz?

Antwort

1

Denken Sie daran, der Code vor der if form.validate_on_submit wird immer noch ausgeführt, wenn ein Formular übergeben wird - und in diesem Code überschreiben Sie die Formulardaten mit Daten aus der Datenbank.

Lassen Sie uns vorgeben, dass der Benutzer seine E-Mail von "[email protected]" zu "[email protected]" auf dem übermittelten Formular geändert hat - dies ist der Code, der ausgeführt wird, wenn das Formular heruntergefallen ist Zweig:

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")) 

So ist die [email protected] Daten zerstört wird, bevor das Formular selbst validiert. Wenn Sie aktualisieren, aktualisieren Sie nur mit den bereits gespeicherten Werten.

+0

OK, das macht Sinn. Ich habe eine Überprüfung hinzugefügt, ob die Anfrage-Methode GET war und Felder nur anfänglich ausfüllen, wenn dies der Fall ist. Dann validiere ich nur auf POST-Methode. Scheint jetzt größtenteils gut zu funktionieren. Vielen Dank! – Dan

Verwandte Themen