拟在Jinj下使用的动态Flask结构

2024-06-02 08:09:01 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我尝试在form类的\uu init \uuuuu部分“动态”构造窗体。似乎元素的构造(在示例中放入注释)与声明部分中的构造不同

在上面的示例中,调用“submit()”的结果是“Non callable object”。而只有在申报部分申报才有可能! 因此,我们想到以下问题:

1)在声明部分的声明和在初始化中的声明有什么区别。我们不是在用“静态”变量!你知道吗

2)如何使“窗体字段”可调用?你知道吗

3)似乎只有在烧瓶窗体的发起方调用之后,可调用性才变得存在。它如何将“方法”添加到此对象?你知道吗

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

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


Tags: fromimportselfform声明表单initdef
1条回答
网友
1楼 · 发布于 2024-06-02 08:09:01

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)

相关问题 更多 >