wtforms 动态增加价值

wtforms add value dynamically

我正在开发结合使用 WTForms 和模板引擎的应用程序。

显示给用户的表单不是预先定义的,但可以由管理员动态配置。所以 WTForm 需要能够动态添加字段,我通过指定这个 Form 的子类来实现这一点 (as suggested by):

class DynamicForm(Form):
@classmethod
def append_field(cls, name, field):
    setattr(cls, name, field)
    return cls

这工作正常,但似乎无法通过此方法通过 Form(obj=values_here) 填充字段。这是我当前对上面提到的 Form 子类的实例化:

values = {}
values['password'] = 'Password123'

form = DynamicForm(obj=values)
form.append_field("password", PasswordField('password'))

所以这是行不通的,当您考虑在调用表单的 init 之后添加字段时,这是有道理的。所以我一直在寻找一种方法来动态分配字段的值,但到目前为止我还没有找到任何运气。

有谁知道将示例中的密码字段设置为特定值的方法吗?将不胜感激。

试试这个:

>>> form = DynamicForm().append_field('password',
                                      PasswordField('password'))(
                                          password="Password123")
>>> form.data
{'password': 'Password123'}

dkol 在这里提到的解决方案就像一个魅力,但它确实需要您真正知道字段的名称(换句话说,它无法计算)。这是因为您在 (password="Password123") 中传递的命名参数的键不能是表达式或变量。这意味着像这样的 for 循环将不起作用:

form = DynamicForm()

for field in fields:
    form = form.append_field(field.label, StringField(field.label))(field.label=field.value)

所以在摆弄了 dkol 提供的以前的解决方案之后,我想到了这个:

form = DynamicForm()

class formReferenceObject:
    pass

for field in fields:
    form = form.append_field(field.label, StringField(field.label))
    setattr(formReferenceObject, field.label, field.value)

form = form(obj=formReference)

此解决方案可能需要更多代码,但仍然非常可读且非常灵活。因此,当使用 for 循环/计算的 <input /> 名称时,这将对您有所帮助。