10

我在使用字典填充表单时遇到问题:

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

5 回答 5

18

问题是 WTForms仅用于getattr检查字段名称是否存在于obj(它不会尝试调用__getitem__)。您可以使用 anamedtuple代替字典,也可以将数据作为关键字参数 ( form = RolodexEntry(**row)) 传递。

于 2013-05-02T01:57:37.973 回答
10

这个答案包括完整性。正如 Sean Vieira 所指出的,WTFormsgetattr用于获取属性名称,这不适用于字典。使用接受的答案

将 Python dict 转换为对象?

这也有效:

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)
于 2013-05-02T21:19:02.447 回答
1

根据 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)

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

于 2018-05-03T09:16:38.680 回答
1

尽管这个问题是不久前提出的,但我建议查看Sean Vieira对这个问题的副本的回答。正如他在回答中所解释的那样,任何具有接口的类getlist都将被wtforms.Form构造函数接受。

于 2016-05-13T17:38:15.727 回答
0

当我使用 flask_wtf 时,我发现 Flask 的表单类让我很困惑。我认为这与@wgwz 对@pgoetz 答案的评论相同。Flask 表单使用来自请求的数据自动填充表单数据。由于我的“RolodexEntry”是嵌入在较大表单中的 FormField,因此自动填充的表单数据无效。为了解决这个问题,我没有继承 Flask 的 Form,而是继承了 wtforms 的 Form。

于 2016-05-20T23:29:11.243 回答