【问题标题】:Form validation in another route Flask另一个路由Flask中的表单验证
【发布时间】:2016-09-29 08:45:22
【问题描述】:

我有一个烧瓶 wtform。我能够在实例化的路径中验证表单。但我想从另一条路线验证它。在不使用会话变量的情况下,有没有其他方法可以从其他路径访问表单对象?

form_class.py

class Fruit ( Form):
    Fruit = SelectField ( choices = [ ( 0,"Select Fruit"), ( 1,'Apple'), (2,'Grape'), (3,'Orange') ], coerce = int, id="Fruit", validators = [Required()])  

views.py

@app.route('/fruit',  methods = ['GET', 'POST'])
def fruit():
    form = Fruit()
    if form.validate_on_submit():
       return render_template("output.html")
    return render_template("name.html", form = form)

name.html

<form action="" method="POST">
      {{ form.hidden_tag() }}
      {{form.Fruit}}
      {{form.Fruit.errors}}
      <input type = "submit">
</form>

上面的代码完全可以正常工作。但我想做如下的事情:

@app.route('/fruit')
def fruit():
    form = Fruit()
    '''if form.validate_on_submit():
       return render_template("output.html")'''
    return render_template("name.html", form = form)

@app.route('/fruit_submit', methods = ['GET', 'POST'])
def fruit_submit():
    print request.form
    if form.validate_on_submit():
       return render_template("output.html")

尝试上述代码时出现以下错误。

NameError: global name 'form' is not defined

【问题讨论】:

  • 每个请求都是唯一的。定义为一个变量的一部分的变量在另一个变量中不存在。此外,这不是 Python 中作用域的工作方式。在一个函数中定义的变量在另一个非嵌套函数中不可用。只需将form = Fruit() 添加到fruit_submit 即可。
  • form = Fruit()fruit_submit 中重新定义?? @dirn
  • 你没有重新定义任何东西。 form 未在 fruit_submit 中定义。那是what NameError means。如果你想在fruit_submit 中使用名为form 的东西,你需要定义它。

标签: python flask flask-wtforms


【解决方案1】:

你必须用 request.form 调用 Fruit 类

@app.route('/fruit_submit', methods = ['GET', 'POST'])
def fruit_submit():
    print Fruit(request.form)
    if Fruit(request.form).validate_on_submit():
       return render_template("output.html")

【讨论】:

  • 应该是Fruit(request.form).validate_on_submit()。请编辑它。我会接受答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多