典型的观点类似于
@app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
# do stufff
return redirect(url_for('somewhere_else', param=param))
return render_template('login.html', form=form)
我感到困惑的是:在调用login()
视图时,是否有LoginForm()
用[{1}}实例化的新form = LoginForm()
?这种全新形式如何validate_on_submit()
?
答案 0 :(得分:3)
在quick-start guide in the documentation:
的第一页中解决了这个问题请注意,您不必将request.form传递给Flask-WTF;它会自动加载。方便的validate_on_submit将检查它是否是POST请求以及它是否有效。
因此,当您实例化表单时,如果可以,它将自动加载现有请求。
答案 1 :(得分:3)
查看flask-wtf
的{{3}}(我删除了无关的片段并添加了评论):
class Form(SecureForm):
# ...
def __init__(self, formdata=_Auto, obj=None, prefix='', csrf_context=None,
secret_key=None, csrf_enabled=None, *args, **kwargs):
# ...
if formdata is _Auto:
if self.is_submitted():
formdata = request.form # !!! LOOK HERE !!!
if request.files:
formdata = formdata.copy()
formdata.update(request.files)
elif request.json:
formdata = werkzeug.datastructures.MultiDict(request.json)
else:
formdata = None
# ...
因此,如果您没有明确地将formdata
传递给表单的构造函数,那么当前的请求就会被提交"" (该方法是PUT或POST),它使用request.form
。