用于Jinja的动态烧瓶形式构造

时间:2018-06-29 06:39:27

标签: python jinja2 flask-wtforms wtforms

我的目的是构造一个带有动态提供标签的表单,并在Jinja Form中使用它。这使我揭示了多个基本问题。 就像这里的例子

    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 keeps giving "Not Callable" error during server run, but not on the python prompt

1 个答案:

答案 0 :(得分:0)

wtforms.Form类中的字段由wtforms.forms.FormMeta元类设置。到表单实例的__init__方法被调用时,为表单添加新字段为时已晚。

您可以按照documentation中的说明动态地修改表单。请注意,这将影响该类的所有将来实例。

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)