为什么一个简单的字典不能正确填充obj for form = myForm(obj = dict)?

时间:2013-05-01 21:53:24

标签: wtforms

我无法使用字典填充表单:

        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])
    ...

5 个答案:

答案 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)

这样,如果我想上传文件,请求就不会获得文件归档数据,所以不要以第二种方式写入!!