我正在开发一个将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 之后添加字段时,这是有道理的。所以我一直在寻找一种动态分配字段值的方法,但到目前为止我还没有运气。
有没有人知道将示例中的密码字段设置为某个值的方法?非常感谢。
答案 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 />
名称时,这将对您有所帮助。