2010-10-03 23 views
14

Varolan bir model için bir düzenleme sayfası oluşturmaya çalışıyorum (zaten db'ye kaydedilmiş). Form nesnesi, çokdisimli bir örneğinin alanlarını doldurmasını bekler.Flask - db modellerini düzenlemek için Flask-WTF ve Flask-SQLAlchemy'yi nasıl birleştiririm?

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

Modelin (form.data['name'] = person.name, etc...) her alanına şeklinde her alanı atamak, ama bu büyük modeller için gereksiz görünüyor: Bu aldığım şeydir. Kaybettiğim kısayol var mı?

cevap

24

wtforms belgelerine bakın:

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

Sen "obj" olarak argüman geçmektedir. Bu varsayılan değerler sağlamak için form alanları için modeli özelliklerini bağlayacak:

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

Bildirim aynı zamanda "populate_obj" yöntemi. Bu, form değerlerini model özelliklerine (yalnızca formunuzda tanımladığınız, dolayısıyla kullanımı oldukça güvenli olan alanlara) bağlayan kullanışlı bir kısayoldur.

+0

Sanırım bunu kaçırdım - teşekkürler! – sa125

+3

Özel tanımlı formunuz, bu db alanları ile aynı alan adlarına sahip olduğu sürece. – Infamy

İlgili konular