如何在Flask/WTForms中使用populate_obj with a FormField?

2024-09-29 23:30:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有位置的用户。正如概念证明一样,位置是CombinedForm中的一个FormField,它应该存储为一个用户模型。最终我希望有相当多的嵌套形式,所以我真的很想表单填充对象(Model)负责处理数据。不过,我一定是做错了什么。这是我的代码:

# - - - Models - - -
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer(), primary_key=True)
    username = db.Column(db.String(40))
    location = db.relationship('Location', backref='user')

class Location(db.Model):
    __tablename__ = 'locations'
    id = db.Column(db.Integer(), primary_key=True)
    user_id = db.Column(db.Integer(), db.ForeignKey('users.id'))
    descr = db.Column(db.String(50))

# - - - Forms - - -
class LocationForm(NoCsrfForm):
    descr = StringField('Location Name')

class CombinedForm(Form):
    username = StringField('User', validators=[DataRequired()])
    location = FormField(LocationForm)  # , default=lambda: Location())
    submit = SubmitField('Submit')

# - - - Routes - - -
@app.route('/', methods=['GET', 'POST'])
def index():
    user = User(username="not in db")
    form = CombinedForm(obj=user)
    if form.validate_on_submit():
        form.populate_obj(user)
        db.session.add(user)
        db.session.commit()
    return render_template('multi.html', form=form)

当我向index函数添加user.location = [Location(descr="Test")]时,我可以在视图中使用{{ form.location }}呈现字段,但是对表单中字段的更改不会对模型产生影响,因为populate_obj不会用POST数据填充Location对象。当FormField在FieldList中时,填充它是有效的。在

我错过了什么?在

我找不到没有FieldList的工作FormField示例。在

我在这方面花了很多时间,甚至在我认为我已经找到答案的时候做了一个example,但我错了,至少在使用带有populate_list而没有FieldList的FormField时。如果有更好的方法来处理2-3个模型中的数据,请告诉我。我快疯了,所以我真的很感激你的帮助。谢谢你的时间。在


Tags: 数据formiddbmodelusernamecolumnlocation
1条回答
网友
1楼 · 发布于 2024-09-29 23:30:53

好像我脑子里真的搞混了,把感情搞砸了。下面的例子很有效。在

请注意,如果确实要将对象(如用户实例)传递到窗体,则必须已填充该位置。如果传递的用户没有位置,则populate\u obj在提交时无法从表单中找到新位置。在

有办法吗?在

这应该是FormField概念的证明:

# - - - Models - - -
class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer(), primary_key=True)
    username = db.Column(db.String(40))
    location_id = db.Column(db.Integer, db.ForeignKey('locations.id'))


class Location(db.Model):
    __tablename__ = 'locations'
    id = db.Column(db.Integer(), primary_key=True)
    descr = db.Column(db.String(50))
    users = db.relationship('User', backref='location')


# - - - Forms - - -
class LocationForm(NoCsrfForm):
    descr = StringField('Location Name')


class CombinedForm(Form):
    username = StringField('User', validators=[DataRequired()])
    location = FormField(LocationForm, default=lambda: Location())
    submit = SubmitField('Submit')


# - - - Routes - - -
@app.route('/', methods=['GET', 'POST'])
def index():
    user = User(username="Def")
    form = CombinedForm()  # don't put a user obj in unless it has a location!
    if form.validate_on_submit():
        form.populate_obj(user)
        db.session.add(user)
        db.session.commit()
    return render_template('multi.html', form=form)

相关问题 更多 >

    热门问题