class LoginForm(Form): #首先执行后得到的结果是UnboundField()对象 name=simple.StringField( label=‘用户名‘, validators=[ validators.DataRequired(message=‘用户名不能为空‘), ], widget=widgets.TextInput(), render_kw={‘class‘: ‘form-control‘} ) pwd=simple.StringField( label=‘密码‘, validators=[ validators.DataRequired(message=‘密码不能为空‘), ], widget=widgets.TextInput(), render_kw={‘class‘: ‘form-control‘} ) @user.route(‘/login‘,methods=[‘GET‘,‘POST‘]) def login(): if request.method==‘GET‘: form=LoginForm() print(form) return render_template(‘login.html‘,form=form) else: form=LoginForm(request.form) if form.validate():
我们还没执行到form=LoginForm()时,LoginForm里面所有的字段都已经执行加载完了,里面的字段的值都是Field实例化而来,
查看上述 LoginForm 中的 name 字段,可以看到它的值是通过 StringField 类实例化返回的对象。查看 StringField 类,会发现它的整个继承体系中都没有指定 metaclass ,所以实例化时真正返回的对象是由它的 __new__ ,它的 __new__ 方法继承自 wtforms.fields.core.Field :
flask 源码专题(四):wtforms Form实例化流程
原文:https://www.cnblogs.com/qiu-hua/p/12636407.html