2010-10-03 3 views
14

Ich versuche, eine Bearbeitungsseite für ein vorhandenes Modell (bereits in db gespeichert) zu erstellen. Das Formularobjekt erwartet, dass eine Multidict-Instanz ihre Felder ausfüllt. Das ist, was ich habe:Flask - Wie kombiniere ich Flask-WTF und Flask-SQLAlchemy, um db-Modelle zu bearbeiten?

# 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 jedes Feld jedes Feld in der Form (form.data['name'] = person.name, etc...) des Modells zuordnen könnte, aber das scheint überflüssig für große Modelle. Gibt es eine Abkürzung, die ich vermisse?

Antwort

24

verweisen auf die wtforms Dokumentation:

http://wtforms.simplecodes.com/docs/0.6/forms.html#wtforms.form.Form

Sie passieren in der "obj" als Argument. Dies wird die Modell-Eigenschaften auf die Formularfelder binden die Standardwerte zu bieten:

@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 „populate_obj“ -Methode. Dies ist eine praktische Abkürzung, die die Formularwerte an die Modelleigenschaften bindet (nur die Felder, die Sie in Ihrem Formular definiert haben, also ziemlich sicher zu verwenden).

+0

Ich glaube, ich habe das verpasst - danke! – sa125

+3

Solange Ihr benutzerdefiniertes Formular dieselben Feldnamen wie die db-Felder hat, funktioniert dies. – Infamy