Конструкция Dynamic Flask-Form, предназначенная для использования под Jinja - PullRequest
0 голосов
/ 29 июня 2018

Моя цель - создать форму с динамически предоставляемыми метками и использовать ее в форме Jinja. Это заставило меня раскрыть несколько основных вопросов. Как в примере здесь

    from flask_wtf import FlaskForm
    from wtforms import SubmitField
    from wtforms.validators import DataRequired

    class LoginForm(FlaskForm):
    #    submit = SubmitField('Go On')

        def __init__(self, BtnLble):
            self.submit = SubmitField(BtnLble,form=self, name="MySbmt", _meta=self.Meta)
    #        self.submit.bind(form=self, name="MySbmt", _meta=self.Meta)
            super(LoginForm,self).__init__()
            self.submit()    # .__call__() does not exist

    def  UseForm( ) :
        Login = LoginForm(“Hit here”)
               if form.validate_on_submit():
                   flash('Wellcom... ' )
                   return redirect(url_for(‘GoOn’))

               return render_template('Login.html', **locals())

Я пытаюсь создать свою форму "динамически" в части __init __ класса формы. Похоже, что конструкция элементов (приведенная в комментарии в примере) отличается от конструкции, сделанной в части объявления

В приведенном выше примере вызов submit () приведет к «Не вызываемому объекту». Пока это будет возможно, если только это объявлено в части объявления! Поэтому на ум приходят следующие вопросы:

1) В чем разница между объявлением в части объявления и объявлением внутри __init __ '. Мы не используем «статическую» переменную ей!

2) Как сделать так, чтобы поле формы вызывалось?

3) Кажется, что вызывающая способность становится существующей только после вызова инициатора FlaskForm. Как он добавляет «метод» к этому объекту?

Я заметил, что подобные вопросы были выявлены другими опытными разработчиками, но они не предоставили их таким простым способом, как этот

WTForms продолжает выдавать ошибку «Не вызывается» во время работы сервера, но не в приглашении python

1 Ответ

0 голосов
/ 30 июня 2018

Поля в классе wtforms.Form устанавливаются метаклассом wtforms.forms.FormMeta. К тому времени, когда вызывается метод __init__ экземпляра формы, уже слишком поздно добавлять новое поле в форму.

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

setattr(LoginForm, 'submit', wtforms.SubmitField('Hit here'))
form = LoginForm()

Если вы хотите настроить метку только для поля в конкретном экземпляре, вы можете сделать это в методе __init__ экземпляра.

class LoginForm(wtforms.Form): 

    submit = wtforms.SubmitField()

    def __init__(self, label, **kwargs):
        super().__init__()
        self.submit.label = wtforms.Label(self.submit.id, label)
...