Как связать поле в функции __init__ формы

63
6

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()

В некоторых сценариях мне нужно динамически добавлять поля в форму. Поле_3, добавленное к форме примера, оказывается UnboundField. Я попытался связать field_3, чтобы сформировать функцию __init__, но это не сработает.

field_3 = TextAreaField()
field_3.bind(self, 'field_3')

Как связать поле_3 с формой примера?

спросил(а) 2021-01-25T21:17:19+03:00 4 месяца, 3 недели назад
1
Решение
76

Используйте self.meta.bind_field для создания связанного поля и назначьте его экземпляру и _fields dict.

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

ответил(а) 2021-01-25T21:17:19+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема