首页 > 解决方案 > 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什么?我不确定错误上升是否有意义,也不知道如何处理这种情况......

谢谢

标签: pythonflaskflask-wtforms

解决方案


这是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给你的表单。在此处查看使用示例。


推荐阅读