我有一个位置的用户。就像概念证明一样,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 示例。
我在这方面花了很多时间,甚至在我认为我已经弄明白的时候做了一个例子,但我错了,至少在没有 FieldList 的情况下使用 FormField 和 populate_list 时。如果有更好的方法可以在一个表单中处理来自 2-3 个模型的数据,请告诉我。我快疯了,所以我真的很感激一些帮助。谢谢你的时间。