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