【问题标题】:Flask - how do I combine Flask-WTF and Flask-SQLAlchemy to edit db models?Flask - 如何结合 Flask-WTF 和 Flask-SQLAlchemy 来编辑数据库模型?
【发布时间】:2011-04-20 12:39:52
【问题描述】:

我正在尝试为现有模型(已保存到数据库)创建一个编辑页面。表单对象需要一个 multidict 实例来填充其字段。这就是我所拥有的:

# 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, etc...) 的每个字段,但这对于大型模型来说似乎是多余的。有没有我遗漏的捷径?

【问题讨论】:

    标签: python forms flask sqlalchemy


    【解决方案1】:

    请参考 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”方法。这是一个方便的快捷方式,可以将表单值绑定到模型属性(仅限您在表单中定义的那些字段,因此使用起来非常安全)。

    【讨论】:

    • 只要您自定义的表单具有与 db 字段相同的字段名称,就可以了。
    猜你喜欢
    • 2015-04-07
    • 2016-03-09
    • 2016-04-22
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多