Flask-Wie kombiniere ich Flask-WTF und Flask-Sqlalchemy, um DB-Modelle zu bearbeiten?
-
27-09-2019 - |
Frage
Ich versuche, eine Bearbeitungsseite für ein vorhandenes Modell zu erstellen (bereits in DB gespeichert). Das Formular Objekt erwartet, dass eine Multidict -Instanz seine Felder bevölkert. Das habe ich:
# the model - assumes Flask-SQLAlchemy
from flask.ext.sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
def __init__(self, name=name):
self.name = name
# the form - assumes Flask-WTF ext.
from flask.ext.wtf import Form, TextField, Required, BooleanField
class PersonForm(Form):
name = TextField('name')
## the view
@app.route('/person/edit/<id>/', methods=['GET', 'POST'])
def edit_person(id):
person = Person.query.get(id)
if person:
form = PersonForm(person) #<-- raises error
return render_template('edit_person.html', form=form)
Ich könnte jedes Feld in der Form jedem Feld des Modells zuweisen (form.data['name'] = person.name, etc...)
, Aber das scheint für große Modelle überflüssig zu sein. Fehlt mir eine Abkürzung?
Lösung
Bitte beachten Sie die WTForms -Dokumentation:
http://wtforms.simplecodes.com/docs/0.6/forms.html#wtforms.form.form
Sie geben das "Obj" als Argument ein. Dadurch wird die Modelleigenschaften an die Formularfelder gebunden, um die Standardwerte bereitzustellen:
@app.route('/person/edit/<id>/', methods=['GET', 'POST'])
def edit_person(id):
person = Person.query.get_or_404(id)
form = PersonForm(obj=person)
if form.validate_on_submit():
form.populate_obj(person)
Beachten Sie auch die Methode "Populate_obj". Dies ist eine praktische Verknüpfung, die die Formwerte an die Modelleigenschaften bindet (nur die Felder, die Sie in Ihrem Formular definiert haben, also ganz sicher zu verwenden).