我有一个具有位置的用户。就像概念证明一样,位置是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")]
添加到索引函数中时,可以在 View 中使用{{ form.location }}
来呈现字段,但是对表单中字段的更改不会对模型产生影响,因为populate_obj不会使用POST数据填充Location对象。当FormField处于FieldList内时,对其进行填充即可。我想念什么?
没有FieldList,我一直无法找到有效的FormField示例。
我花了很多时间在此上,甚至在我以为自己想通了的时候做了一个example,但是我错了,至少在将FormField与不带FieldList的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)