用于 Jinja 的 Dynamic Flask-Form 结构

Dynamic Flask-Form construction intended for use under Jinja

我的目的是构建一个带有动态提供的标签的表单,并在 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())

我尝试在表格 class 的 __init __ 部分“动态”构建我的表格。似乎元素的构造(在示例中放在注释中)与声明部分所做的不同

在上面的例子中,调用“submit()”的结果是“Non callable object”。虽然只有在声明部分声明它才有可能! 所以我想到了以下问题:

1) 声明部分的声明和在__init __'.我们没有使用“静态”变量她!

2) 如何使“表单字段”可调用?

3) 好像只有在FlaskForm的initiator调用之后,callability才会存在。它如何向该对象添加“方法”?

我注意到其他有经验的开发人员已经提出了类似的问题,但他们并没有像这样简单地提供这些问题

WTForms keeps giving "Not Callable" error during server run, but not on the python prompt

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

您可以动态修改表单 class,如 documentation 中所述。请注意,这将影响 class.

的所有未来实例
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)