繁体   English   中英

如何在表单的__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 F1(Form):
    x = StringField()

class F2(F1):
    y = StringField()

form = F1() if type == 1 else F2()

如果需要提高动态性,可以对表单进行子类化并为其分配字段。 与实例不同,直接将字段分配给类是有效的。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM