我无法使用字典填充表单:
row = {'firstname':'Bob', 'lastname': "Smith",
'email': 'bob@bubba.com', 'phone': '512.999.1212'}
form = RolodexEntry(obj=row)
不会将任何数据放入表格中(即在前面之后的form.firstname.data = None)。
表单定义的顶部如下所示。我不知道下一步该尝试什么。表单文档只是说:
obj - 如果formdata为空或未提供,则检查此对象是否存在与表单字段名称匹配的属性,这些属性将用于字段值。
class RolodexEntry(Form):
firstname = TextField('First Name',[validators.length(max=40)],
filters=[strip_filter])
lastname = TextField('Last Name', [validators.length(max=40)],
filters=[strip_filter])
email = TextField('Email', [validators.Optional(),
validators.length(max=25),
validators.Email()],
filters=[strip_filter])
...
答案 0 :(得分:15)
问题是WTForms only use getattr
to check if the field name exists in obj
(它不会尝试调用__getitem__
)。您可以使用namedtuple
代替字典,也可以将数据作为关键字参数传递(form = RolodexEntry(**row)
)。
答案 1 :(得分:6)
这个答案包括完整性。正如Sean Vieira所指出的,WTForms正在使用getattr
获取属性名称,这不适用于字典。使用
Convert Python dict to object?
这也有效:
class Struct:
def __init__(self, **entries):
self.__dict__.update(entries)
row = {'firstname':'Bob', 'lastname': "Smith",
'email': 'bob@bubba.com', 'phone': '512.999.1212'}
rowobj = Struct(**row)
form = RolodexEntry(obj=rowobj)
答案 2 :(得分:1)
虽然这个问题刚才被提出,但我建议Sean Vieira's answer看一下这个问题的副本。正如他的回答中所解释的那样,任何包含getlist
接口的类都将被wtforms.Form
构造函数接受。
答案 3 :(得分:0)
当我使用flask_wtf时,我发现Flask的表格让我搞砸了。我认为这与@ wgwz对@ pgoetz的答案的评论是同一个问题。 Flask表单自动填充formdata,其中包含来自请求的数据。由于我的“RolodexEntry”是嵌入在较大表单中的FormField,因此自动填充的表单数据无效。为了解决这个问题,我没有对Flask的Form进行子类化,而是将wtforms的表格子类化。
答案 4 :(得分:0)
根据Sean Vieira的回答,在我的烧瓶应用程序中,我写了这样的代码:
from collections import namedtuple
UpdateSchema= namedtuple('UpdateSchema', ['name', 'real_name', 'email', 'phone'])
update_schema = UpdateSchema(
name= current_user.name,
real_name=current_user.job_hunter.real_name,
email=current_user.email,
phone=current_user.job_hunter.phone
)
form = UpdateJobHunterForm(obj=update_schema)
我的应用是一个求职网站,我建议你不要这样写:
update_schema = dict(
'name': current_user.name,
'real_name':current_user.job_hunter.real_name,
'email':current_user.email,
'phone':current_user.job_hunter.phone
)
form = UpdateJobHunterForm(**update_schema)
这样,如果我想上传文件,请求就不会获得文件归档数据,所以不要以第二种方式写入!!