wtforms动态增加价值

时间:2015-09-15 09:59:06

标签: python dynamic wtforms

我正在开发一个将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'))

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

有没有人知道将示例中的密码字段设置为某个值的方法?非常感谢。

2 个答案:

答案 0 :(得分:2)

试试这个:

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

答案 1 :(得分:0)

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 />名称时,这将对您有所帮助。