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 />
名称时,这将对您有所帮助。
我正在开发结合使用 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 />
名称时,这将对您有所帮助。