python - Flask WTF 无法从提供的 obj 或输入数据/默认值中找到要填充的值
问题描述
我正在将 python Flask 与 WTForm 一起使用,但该populate_obj
方法存在严重问题:
Traceback (most recent call last):
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 2088, in __call__
return self.wsgi_app(environ, start_response)
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 2073, in wsgi_app
response = self.handle_exception(e)
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 2070, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1515, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1513, in full_dispatch_request
rv = self.dispatch_request()
File "/usr/local/lib/python3.9/site-packages/flask/app.py", line 1499, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
File "/app/my_data/main.py", line 29, in submit
form.populate_obj(demande)
File "/usr/local/lib/python3.9/site-packages/wtforms/form.py", line 95, in populate_obj
field.populate_obj(obj, name)
File "/usr/local/lib/python3.9/site-packages/wtforms/fields/core.py", line 877, in populate_obj
raise TypeError('populate_obj: cannot find a value to populate from the provided obj or input data/defaults')
TypeError: populate_obj: cannot find a value to populate from the provided obj or input data/defaults
这是我的代码(没什么花哨的):
form = DemandeForm(data=request.form)
if form.validate():
form.populate_obj(demande)
flash('Enregistré', 'success')
return redirect(url_for('main.index'))
我可以详细说明所有表单字段,但这会很乏味。我的猜测是,这与我正在使用的嵌套表单有关:
class DemandeForm(BaseForm):
AdressePrivee = FormField(AdresseForm)
AdresseProfessionnelle = FormField(AdresseForm)
Prestations = FieldList(FormField(PrestationForm), min_entries=1)
所以我的问题是:
- 为什么错误上升?
- 我怎样才能有更明确的错误,告诉我哪些字段引发了问题?
- 我该如何解决这个问题?
我现在完全被锁定了:(
谢谢你的支持
编辑
所以我终于设法确认问题来自FormField(AddressField)
.
这是我的Demande
模型摘录:
AdressePrivee = db.relationship(AdressePrivee, backref='Demande', lazy=False, uselist=False)
并在DemandeForm
:
AdressePrivee = FormField(AdresseForm)
Wtform 不高兴,因为demande.AdressePrivee
== None
,因此self._obj is None
在代码中并且错误上升。
我尝试添加默认值:
AdressePrivee = FormField(AdresseForm, default=AdressePrivee())
但是后来我在保存时遇到错误,因为AddressePrivee
字段是空的,而它们不应该......
是不是缺少一个选项,比如nullable: True
什么?我不确定错误上升是否有意义,也不知道如何处理这种情况......
谢谢
解决方案
这是WTF函数的相关源代码,这是触发错误的地方:
def populate_obj(self, obj, name):
candidate = getattr(obj, name, None)
if candidate is None:
if self._obj is None:
raise TypeError('populate_obj: cannot find a value to populate from the provided obj or input data/defaults')
candidate = self._obj
setattr(obj, name, candidate)
self.form.populate_obj(candidate)
self._obj
在例程中被赋值process
。
因此,您传递的变量似乎有问题。事实上,我不明白你为什么将等价物传递current_user
给你的表单。在此处查看使用示例。
推荐阅读
- r - 根据列中的(二分法)值拆分数据框
- javascript - 使 webpack 将文件从 src 移动到 dest 而不处理它
- python - TF: 如何解决 ValueError: Variable ...weight 已经存在,不允许。你的意思是设置reuse=True
- r - Rmarkdown:是否可以对第一个标题进行制表符?
- c++ - 如何从OpenCV中的目录中依次读取文件并用于处理?
- python - 在python中读取输入文件
- excel - 浓缩一个大公式
- android - Instagram 等视频过滤器并保存在 SDCARD 中
- c# - 无法在 Android 4.4 中从 javascript 调用 Sanitize 方法,而在 Android 4.1 中同样有效
- c# - 并发保存数据