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

     2023-02-24     166

关键词:

【中文标题】如何在带有 FormField 的 Flask / WTForms 中使用 populate_obj?【英文标题】:How to use populate_obj in Flask / WTForms with a FormField? 【发布时间】:2016-04-12 17:52:35 【问题描述】:

我有一个有位置的用户。正如概念证明一样,Location 是 CombinedForm 中的一个 FormField,应该存储为 User Model。最终我想要有相当多的嵌套表单,所以我真的希望 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 数据的位置对象。当 FormField 在 FieldList 中时,填充它就可以了。

我错过了什么?

我无法找到没有 FieldList 的工作 FormField 示例。

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

【问题讨论】:

【参考方案1】:

看来我脑子里真的很混乱,搞错了关系。下面的例子有效。

请注意,如果您确实将一个对象(如 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)

【讨论】:

用数据填充 WTForms FormField FieldList 会在字段中生成 HTML

】用数据填充WTFormsFormFieldFieldList会在字段中生成HTML【英文标题】:FillingWTFormsFormFieldFieldListwithdataresultsinHTMLinfields【发布时间】:2015-06-1310:04:38【问题描述】:我有一个Flask应用程序,我可以在其中通过上传CSV文件来填充表单数... 查看详情

带有声明性 ORM 扩展的 Flask SQLAlchemy

...项目中使用带有声明性扩展的sqlalchemyORM。Flask文档展示了如何在端点here内正确执行查询现在这一切都很好,但是如果我想通过查询执行一个组怎么办。例如给定烧瓶文档中的用户域 查看详情

如何在 ModelAdmin.formfield_for_manytomany() 中使用 Django QuerySet.union()?

】如何在ModelAdmin.formfield_for_manytomany()中使用DjangoQuerySet.union()?【英文标题】:HowtouseDjangoQuerySet.union()inModelAdmin.formfield_for_manytomany()?【发布时间】:2020-10-2323:23:39【问题描述】:不知道我在这里做错了什么:我尝试在Django2.2.10中... 查看详情

在 Flask 中构建带有动态元素的 Bootstrap 表

】在Flask中构建带有动态元素的Bootstrap表【英文标题】:BuildingaBootstraptablewithdynamicelementsinFlask【发布时间】:2015-12-2219:26:50【问题描述】:我正在与Flask合作,根据从SQLAlchemy数据库中获取的人员列表构建Bootstrap表。但是,我想放... 查看详情

如何在 Flask 中重新加载有错误的 fancybox iframe 表单

】如何在Flask中重新加载有错误的fancyboxiframe表单【英文标题】:HowdoIreloadfancyboxiframeformwitherrorsinFlask【发布时间】:2017-04-2818:12:37【问题描述】:在Flask中有一个iframe显示一个带有fancybox的登录表单,它工作正常,但如果出现错... 查看详情

带有 GAE ndb 的 Flask Flask 安全性?

】带有GAEndb的FlaskFlask安全性?【英文标题】:FlaskFlask-SecuritywithGAEndb?【发布时间】:2014-03-0211:46:41【问题描述】:我正在使用Flask上的Python在GoogleAppEngine上构建和托管我的应用程序。现在我想使用flask-security扩展并意识到在我的... 查看详情

如何在 Flask 框架中实现服务器推送?

】如何在Flask框架中实现服务器推送?【英文标题】:HowtoimplementserverpushinFlaskframework?【发布时间】:2012-08-2706:32:38【问题描述】:我正在尝试在Flask微网络框架上构建一个带有服务器推送功能的小站点,但我不知道是否有框架可... 查看详情

在 ModelForms 中继承 formfield_callback 的 Django 问题

】在ModelForms中继承formfield_callback的Django问题【英文标题】:DjangoProbleminheritingformfield_callbackinModelForms【发布时间】:2011-11-1215:55:25【问题描述】:我现在才使用Django几个星期,所以我可能会遇到各种各样的错误,但是:我有一个... 查看详情

在 ModelForms 中继承 formfield_callback 的 Django 问题

】在ModelForms中继承formfield_callback的Django问题【英文标题】:DjangoProbleminheritingformfield_callbackinModelForms【发布时间】:2011-11-1215:55:25【问题描述】:我现在才使用Django几个星期,所以我可能会遇到各种各样的错误,但是:我有一个... 查看详情

在更新时显示从 Flask 视图流式传输的数据

...】:我有一个实时生成数据并流式传输的视图。我不知道如何将这些数据发送到我可以在我的HTML模板中使用的变量。我当前的解决方案只是在数据到达时将数据输出到空白页面,这很有效,但我想将其包含在带有格式的更大页... 查看详情

带有 ArcGIS 的 Flask 应用程序,Arcpy 无法运行

】带有ArcGIS的Flask应用程序,Arcpy无法运行【英文标题】:FlaskappwithArcGIS,Arcpydoesnotrun【发布时间】:2018-12-1922:23:43【问题描述】:我有一个脚本,它从MSSQL数据库中获取一个表,然后将其注册到ArcGIS。它还使用了其他几种arcpy方法... 查看详情

使用带有 Python Flask 的 HTML 表单搜索 MongoDB 集合

】使用带有PythonFlask的HTML表单搜索MongoDB集合【英文标题】:UsinganHTMLformwithPythonFlasksearchaMongoDBcollection【发布时间】:2020-11-1306:23:10【问题描述】:我希望用户在书名的搜索表单中进行随机搜索,如果书在数据库中,则查找获取... 查看详情

如何在没有 Flask 的 Heroku 上托管 websocket 应用程序 python 服务器?

】如何在没有Flask的Heroku上托管websocket应用程序python服务器?【英文标题】:HowtohostwebsocketapppythonserveronHerokuwithoutFlask?【发布时间】:2018-09-2410:14:30【问题描述】:所以我正在做一个学校项目,我必须制作一个python服务器和android... 查看详情

Flask jwt POST 数据到带有令牌的端点

】FlaskjwtPOST数据到带有令牌的端点【英文标题】:FlaskjwtPOSTdatatoendpointwithatoken【发布时间】:2021-10-2711:57:57【问题描述】:这个Flask端点是我尝试在POST上使用jwt令牌来解决Insomnia的问题:@app.route(\'/\',methods=[\'POST\'])@token_requireddefj... 查看详情

Flask 视图显示 400 错误而不是带有表单的模板

】Flask视图显示400错误而不是带有表单的模板【英文标题】:Flaskviewshows400errorinsteadoftemplatewithform【发布时间】:2018-02-2701:34:14【问题描述】:我正在尝试显示带有表单的页面,然后在提交表单时将Player添加到数据库中。但是,... 查看详情

SocketIO + Flask 检测断开连接

...在这里有一个不同的问题,但我意识到它可以简化为:您如何检测客户端何时从页面断开(关闭其页面或单击链接)(换句话说,套接字连接关闭)?我想制作一个带有更新用户列表的聊天应用程序,并且我在Python上使用Flask。... 查看详情

如何压缩整个文件夹(带有子文件夹)并通过 Flask 提供它而不将任何内容保存到磁盘

】如何压缩整个文件夹(带有子文件夹)并通过Flask提供它而不将任何内容保存到磁盘【英文标题】:HowdoIzipanentirefolder(withsubfolders)andserveitthroughFlaskwithoutsavinganythingtodisk【发布时间】:2018-12-2107:31:44【问题描述】:我的网络服务... 查看详情

AWS上带有nginx和gunicorn的Flask应用程序[重复]

】AWS上带有nginx和gunicorn的Flask应用程序[重复]【英文标题】:FlaskapplicationwithnginxandgunicornonAWS[duplicate]【发布时间】:2019-10-0323:30:18【问题描述】:我有一个简单的Flask应用程序(只是显示“Helloworld”),我想将它部署在AWSElasticBe... 查看详情