Динамическая форма колбы 'wtforms.fields.core.UnboundField object' не имеет атрибута - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь сделать динамическую форму в колбе. Я следовал документации по динамическим формам , и все получилось. Мне не понравилось расположение, однако. В документации показано, как создать класс формы из родительского класса, а затем добавить к нему атрибуты в представлении. Я подумал, что можно будет создать класс формы и передать ему список значений, чтобы динамически устанавливать для него атрибуты при создании экземпляра.

Когда я делаю это, я получаю ошибку У объекта 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')

Вопросы:

  1. Что означает объект wtforms.fields.core.UnboundField и почему я получаю его в первом примере, а не во втором?

  2. Есть ли способ сделать то, что я пытаюсь, или я должен вернуться к тому, как это показано в документации со всем этим в моей функции просмотра?

Спасибо за любые отзывы.

...