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

标签 python flask wtforms formfield

我有一个有位置的用户。正如概念证明,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/

相关文章:

python - WTForms - 内置消息翻译

flask - WTForms 日期验证

python - String.find 不返回任何值

Python requests - Session ,定义一个默认网站用于跟随相对url请求

python - 尝试在 render_template() (Flask)之后使用访问另一个作用域中的变量?

flask - Redis错误: ('_kombu.binding.reply.celery.pidbox' ) has been removed from the Redis database

python - 如何使用 pandas 现有列之一中的列表创建新列,并从另一列的列表中分配值?

python - 使用 pyinstaller 和 mayavi 导入创建独立的 exe

python - Flask-Admin多对多字段展示

python - Flask 的通用 CRUD 管理员,带有 WTForms?