Flask - 如何结合Flask-WTF和Flask-SQLAlchemy编辑数据库模型?

20 投票
1 回答
13927 浏览
提问于 2025-04-16 04:56

我正在尝试为一个已经存在的模型(已经保存到数据库中)创建一个编辑页面。这个表单对象需要一个多字典实例来填充它的字段。这是我现在的代码:

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

我可以把表单中的每个字段都手动赋值给模型中的每个字段,比如 (form.data['name'] = person.name, 其他字段也是这样...) ,但对于字段很多的模型来说,这样做显得有点繁琐。有没有什么简单的方法可以做到这一点呢?

1 个回答

29

请参考wtforms的文档:

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

你需要把“obj”作为参数传入。这会把模型的属性和表单的字段绑定在一起,从而提供默认值:

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

另外,注意“populate_obj”这个方法。它是个很方便的快捷方式,可以把表单中的值绑定到模型的属性上(只会绑定你在表单中定义的字段,所以用起来相对安全)。

撰写回答