【问题标题】:Flask form not getting validated烧瓶表单未得到验证
【发布时间】:2020-05-23 08:29:57
【问题描述】:

我的烧瓶表单没有得到验证。

 @admin_blueprints.route('/ManageMovies',methods=['GET', 'POST'])
 def ManageMovie():

 form = SetShowForm(request.form)

 if request.method == 'POST' and form.validate():

      print(form.movie.data)

      return redirect(url_for('admin.AdminHome'))



 engine = create_engine('mssql+pyodbc://DESKTOP-6UNRAN0/movie_f?driver=SQL Server? 
 Trusted_Connection=yes')

 form.movie.choices = [(movie.m_id, movie.m_name)for movie in (engine.execute('select * from 
 MovieMaster'))]

 form.show_time.choices = [(time.s_id, time.s_time) for time in (engine.execute('select * from 
 ShowTime'))]



 return render_template('manage_movies.html',form=form)

我的模板代码是

 {% extends "master.html" %}


 {% block content %}

  <form method="POST">

   {{ form.hidden_tag() }}
   {{form.movie.label}}{{form.movie(class="form-control")}}
   <br>
   {{ form.show_time.label }} {{form.show_time(class="form-control")}}
   <br>
   {{form.price.label}} {{ form.price(class="form-control") }}

   <br>
   {{form.submit(class="btn btn-success")}}
   </form>



   {% endblock %}

我的烧瓶形式

 class SetShowForm(FlaskForm):
       movie = SelectField('Movie Name', choices=[])
       show_time = SelectField('Set Show Time',choices=[])
       price = IntegerField('Price')

       submit = SubmitField("Set")

单击提交按钮后,会再次呈现同一页面,而不是输入我的 (if request.method == 'POST' and form.validate():) 语句并打印数据。我不知道出了什么问题。我正在填写所有字段。是否有任何表单验证规则。

【问题讨论】:

  • 您正在动态地将选项添加到您的表单中。在尝试进行验证测试之前,您需要移动此代码。 IE。目前,当您检查验证时,您的表单对有效选择一无所知。
  • 我删除了 (form.validate()) 并保留了 (request.method == POST)。代码开始正常工作。如何以及是否是一种好的做法。

标签: flask flask-wtforms


【解决方案1】:

相信你需要使用:

if form.validate_on_submit():

而且您不需要检查“POST”,因为validate_on_submit 也会这样做。

【讨论】:

    【解决方案2】:

    试试看

     @admin_blueprints.route('/ManageMovies',methods=['GET', 'POST'])
    def ManageMovie():
    
    form = SetShowForm()
    
    if form.validate_on_submit():
    
      print(form.movie.data)
    
      return redirect(url_for('admin.AdminHome'))
    
    return render_template('manage_movies.html',form=form)
    

    并直接在 setShowForm() 中设置选择值

    【讨论】:

    • 我删除了 (form.validate()) 并保留了 (request.method == POST)。代码开始正常工作。如何以及是否是一种好的做法。
    • 好的做法是使用validate_on_submit(),它会自动接受POST发送的请求。我已经更新了我的答案检查它。
    猜你喜欢
    • 2020-11-18
    • 2017-09-02
    • 1970-01-01
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多