gpt4 book ai didi

python - 如何在带有 FormField 的 Flask/WTForms 中使用 populate_obj?

转载 作者:行者123 更新时间:2023-11-28 19:14:56 26 4
gpt4 key购买 nike

我有一个有位置的用户。正如概念证明,Location 是 CombinedForm 中的一个 FormField,它应该存储为一个用户模型。最终我想要有相当多的嵌套表单,所以我真的很想 form.populate_obj(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)

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

我错过了什么?

我一直无法找到没有 FieldList 的有效 FormField 示例。

我在这上面花了很多时间,甚至做了一个 example当我以为我已经弄清楚了,但我错了,至少在不使用 FieldList 的情况下将 FormField 与 populate_list 一起使用时。如果有更好的方法来处理一个表格中 2-3 个模型的数据,请告诉我。我快疯了,所以我真的很感激一些帮助。感谢您的宝贵时间。

最佳答案

看来我的头脑真的很困惑,并且弄错了关系。下面的示例有效。

请注意,如果您确实将一个对象(如 User 实例)传递给表单,则它必须已经填充了位置。如果您传递一个没有位置的用户,populate_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)

关于python - 如何在带有 FormField 的 Flask/WTForms 中使用 populate_obj?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34670421/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com