【问题标题】:How do different Form objects communicate in Flask-wtforms?Flask-wtforms 中不同的 Form 对象如何通信?
【发布时间】:2015-01-23 13:27:30
【问题描述】:

典型的视图类似于

@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() 视图时,不是用form = LoginForm() 实例化了一个新的LoginForm() 吗?这个全新的表单validate_on_submit()怎么过?

【问题讨论】:

    标签: python flask wtforms flask-wtforms


    【解决方案1】:

    quick-start guide in the documentation的第一页中已解决:

    请注意,您不必将 request.form 传递给 Flask-WTF;它会自动加载。并且方便的 validate_on_submit 会检查是否是 POST 请求,是否有效。

    因此,当您实例化表单时,如果可以,它将自动加载到现有请求中。

    【讨论】:

      【解决方案2】:

      flask-wtfthe source code(我去掉了不相关的片段并添加了cmets):

      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

      【讨论】:

        猜你喜欢
        • 2021-05-07
        • 2015-12-17
        • 1970-01-01
        • 1970-01-01
        • 2015-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多