如何在表单的 __init__ 函数中绑定字段
How to bind a field in __init__ function of a form
class Example_Form(Form):
field_1 = TextAreaField()
field_2 = TextAreaField()
def __init__(self, type, **kwargs):
super(Example_Form, self).__init__(**kwargs)
if type == 'type_1':
self.field_3 = TextAreaField()
在某些情况下,我需要在表单中动态添加字段。添加到示例表单的 field_3 结果是一个 UnboundField。我试图将 field_3 绑定到 __init__
函数中,但它不起作用。
field_3 = TextAreaField()
field_3.bind(self, 'field_3')
如何将 field_3 绑定到示例表单?
使用self.meta.bind_field
创建绑定字段,并将其分配给实例和_fields
字典。
self.field_3 = self._fields['field_3'] = self.meta.bind_field(
self, TextAreaField(),
{'name': 'field_3', 'prefix': self._prefix}
)
在大多数情况下,使用子class并决定在创建表单实例时使用哪个class会更清楚。
class F1(Form):
x = StringField()
class F2(F1):
y = StringField()
form = F1() if type == 1 else F2()
如果您需要更加动态,可以子class 表单并为其分配字段。将字段分配给 classes 可以直接工作,这与实例不同。
class F3(F1):
pass
if type == 3:
F3.z = StringField()
form = F3()
您也可以定义所有字段,然后在验证表单之前选择删除一些字段。
class F(Form):
x = StringField()
y = StringField()
form = F()
if type == 1:
del form.y
class Example_Form(Form):
field_1 = TextAreaField()
field_2 = TextAreaField()
def __init__(self, type, **kwargs):
super(Example_Form, self).__init__(**kwargs)
if type == 'type_1':
self.field_3 = TextAreaField()
在某些情况下,我需要在表单中动态添加字段。添加到示例表单的 field_3 结果是一个 UnboundField。我试图将 field_3 绑定到 __init__
函数中,但它不起作用。
field_3 = TextAreaField()
field_3.bind(self, 'field_3')
如何将 field_3 绑定到示例表单?
使用self.meta.bind_field
创建绑定字段,并将其分配给实例和_fields
字典。
self.field_3 = self._fields['field_3'] = self.meta.bind_field(
self, TextAreaField(),
{'name': 'field_3', 'prefix': self._prefix}
)
在大多数情况下,使用子class并决定在创建表单实例时使用哪个class会更清楚。
class F1(Form):
x = StringField()
class F2(F1):
y = StringField()
form = F1() if type == 1 else F2()
如果您需要更加动态,可以子class 表单并为其分配字段。将字段分配给 classes 可以直接工作,这与实例不同。
class F3(F1):
pass
if type == 3:
F3.z = StringField()
form = F3()
您也可以定义所有字段,然后在验证表单之前选择删除一些字段。
class F(Form):
x = StringField()
y = StringField()
form = F()
if type == 1:
del form.y