Python WTF表格动态生成

Python WTF表格动态生成,python,wtforms,flask-wtforms,Python,Wtforms,Flask Wtforms,我有两个WTF表格 class SportStartForm(Form): ski = DateField(format='%d.%m.%Y') kitesurfing = DateField(format='%d.%m.%Y') windsurfing = DateField(format='%d.%m.%Y') surfing = DateField(format='%d.%m.%Y') class UpdateUserForm(Form): sp

我有两个WTF表格

class SportStartForm(Form):
    ski = DateField(format='%d.%m.%Y')
    kitesurfing = DateField(format='%d.%m.%Y')
    windsurfing = DateField(format='%d.%m.%Y')
    surfing = DateField(format='%d.%m.%Y')


class UpdateUserForm(Form):
    sport_start_at = FormField(SportStartForm)
它工作得很好,但我想动态生成一个这样的表单

class SportStartForm(Form):
    def __new__(cls, **kwargs):
       for s in SPORTS:
           setattr(cls, s, DateField(format='%d.%m.%Y'))
    return super(SportStartForm, cls).__new__(cls, **kwargs)
如果我这样做,我会得到一个表单验证异常

for name, unbound_field in itertools.chain(fields, extra_fields):
TypeError: 'NoneType' object is not iterable

我在这里研究了一些关于wtfforms动态生成的标签问题,但对我来说不起作用。我遗漏了什么?

导致错误的基本问题是,因为您重写了
\uuuu new\uuuu
,然后调用了超级构造函数,从而绕过了将字段映射传递到的超级构造函数

然而即使尝试整合此界面,也可能最终无法满足您的需求,这需要大量的工作。原因是WTForms在
Form
上使用一个元类,它在类实例化之前的某个点检查字段并缓存未绑定字段列表,并且在实例化时完成输入处理,这要求所有字段都在该点声明


按照页面中的提示,您可以使用以下方法之一更安全地创建动态表单:

1。假设应用程序初始化后运动不会改变,我们只需创建一个顶级类并在其上设置属性即可

class SportStartForm(Form):
    pass

for s in SPORTS:
    setattr(SportStartForm, s, DateField(format='%d.%m.%Y'))
2.或者,如果运动是可以改变的,并且由于某些用户规则而具有动态性,则可以在视图中完成,就像在上面链接的页面中一样,或者作为工厂:

def factory(sports):
    # This form class is created in a local scope, so a new class object
    # is made each time your factory is called
    class SportStartForm(Form):
        pass

    for s in sports:
        setattr(SportStartForm, s, DateField(format='%d.%m.%Y'))

    return SportStartForm
然后,factory模型的使用可能类似于:

def view(request):
    form_class = factory(['tennis', 'golf', 'windsurfing'])
    form = form_class(request.form)
    # etc, rest of view