Wtforms动态生成

2024-10-02 00:37:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个厕所

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)

它工作得很好,但是我想动态生成一个这个表单

^{pr2}$

如果我这样做,我会得到一个关于表单验证的异常

^{3}$

我在这里研究了几个关于标签的问题,这些标签都是关于动态生成的,但是对我来说没有用。我错过了什么?在


Tags: formformat表单动态标签classdatefieldsurfing
1条回答
网友
1楼 · 发布于 2024-10-02 00:37:25

导致该错误的基本问题是,由于您重写了__new__并调用了超级构造函数,因此您最终绕过了将字段映射传递到^{}的{a1}。在

然而即使试图符合这个界面,也可能不会得到您想要的结果,这不是没有大量的工作要做。原因是WTForms在Form上使用了一个元类,它在类实例化之前的某个点检查字段并缓存未绑定字段列表,并且在实例化时完成输入处理,这要求在该点声明所有字段。在


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

1。假设SPORTS在应用程序初始化后不会发生变化,我们可以简单地创建一个顶级类并在其上设置属性

class SportStartForm(Form):
    pass

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

2.或者,如果运动是可以改变的,并且由于某些用户规则而具有动态性,则可以像在上面链接的页面中一样在视图中进行,或者作为工厂来完成:

^{pr2}$

工厂的用法可能是这样的:

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

相关问题 更多 >

    热门问题