Я пытаюсь сделать динамическую форму в колбе. Я следовал документации по динамическим формам , и все получилось. Мне не понравилось расположение, однако. В документации показано, как создать класс формы из родительского класса, а затем добавить к нему атрибуты в представлении. Я подумал, что можно будет создать класс формы и передать ему список значений, чтобы динамически устанавливать для него атрибуты при создании экземпляра.
Когда я делаю это, я получаю ошибку
У объекта wtforms.fields.core.UnboundField нет атрибута ... затем я устанавливаю какой-либо атрибут, в котором он отсутствует, и затем появляется новый. Так что это похоже на удар моль и не чувствует себя правильно.
Моя первая попытка:
class PathsForm(FlaskForm):
def __init__(self, paths, *args, **kwargs):
super().__init__(*args, **kwargs)
self.paths = paths
i=0
row_list = []
for path in self.paths:
param_name = 'param_{}'.format(str(i))
custom_param_name = 'custom_param_{}'.format(str(i))
path_name = 'path_{}'.format(str(i))
parameter = SelectField('Parameter', choices = [('',''),
('choice_1', 'Choice 1'),
('choice_2', 'Choice 2'),
])
parameter.id = param_name
custom_parameter = StringField('Custom Parameter')
custom_parameter.id = custom_param_name
path_field = SelectField('Path')
path_field.choices = [('','')]+[(path,path) for path in self.paths]
setattr(self, param_name, parameter)
setattr(self, custom_param_name, custom_parameter)
setattr(self, path_name, path_field)
row_list.append((param_name, custom_param_name, path_name))
i += 1
self.row_list = row_list
cbt_id = HiddenField('CBT ID', validators = [DataRequired()])
submit = SubmitField('Submit')
Мне удалось получить форму для рендеринга со второй попытки, но она одинаково устанавливает все имена и идентификаторы, что наносит ущерб проверке. Я делаю это, устанавливая атрибуты класса и передавая их динамически в формы.
Вторая попытка:
class PathsForm(FlaskForm):
parameter = SelectField('Parameter', choices = [('',''),
('choice_1', 'Choice 1'),
('choice_2', 'Choice 2'),
])
custom_parameter = StringField('Custom Parameter')
path_field = SelectField('Path')
def __init__(self, paths, *args, **kwargs):
super().__init__(*args, **kwargs)
self.paths = paths
i=0
row_list = []
for path in self.paths:
param_name = 'param_{}'.format(str(i))
custom_param_name = 'custom_param_{}'.format(str(i))
path_name = 'path_{}'.format(str(i))
self.path_field.choices = [('','')]+[(path,path) for path in self.paths]
setattr(self, param_name, self.parameter)
setattr(self, custom_param_name, self.custom_parameter)
setattr(self, path_name, self.path_field)
row_list.append((param_name, custom_param_name, path_name))
i += 1
self.row_list = row_list
cbt_id = HiddenField('CBT ID', validators = [DataRequired()])
submit = SubmitField('Submit')
Вопросы:
Что означает объект wtforms.fields.core.UnboundField и почему я получаю его в первом примере, а не во втором?
Есть ли способ сделать то, что я пытаюсь, или я должен вернуться к тому, как это показано в документации со всем этим в моей функции просмотра?
Спасибо за любые отзывы.