【问题标题】:Flask WTForm: submit button produces no errorFlask WTForm:提交按钮不会产生错误
【发布时间】:2020-05-11 22:58:30
【问题描述】:

我使用了相同的表单来提交,并且它在过去一直有效。提交按钮现在不起作用,因此 POST 和验证循环中的所有内容都没有被执行。

这是一个单页网络应用程序。此表单应包含 7 个字段并写入数据库。该应用程序确实正确打印了数据库中的记录(recent_data),因此与数据库的连接是正确的。

预期行为:这应该会产生一个 POST-GET 重定向。提交按钮应该会触发一个 POST,它应该会重定向到主页,表单现在是空的。

当前行为:提交按钮不执行任何操作。

复制:我认为这可以通过添加到我的代码中的普通样板烧瓶应用程序代码来复制。

调试:没有显示错误。

class ApplicationForm(FlaskForm):
    emp_length_cat_input = IntegerField(
        u'How long have you been with your employer? (1-11)',
        validators=[DataRequired()])
    home_status_input = IntegerField(
        u'What is your housing status? (1-Rent, 2-Other, 3-Mortgage, 4-Own)',
        validators=[DataRequired()])
    zip3_input = IntegerField(
        u'What is the first 3 digits of your zip code?',
        validators=[DataRequired()])
    total_acc_input = IntegerField(
        u'How many accounts have you ever had in your name?',
        validators=[DataRequired()])
    annual_inc_input = IntegerField(
        u'What is your annual income? (no commas)',
        validators=[DataRequired()])
    dti_input = IntegerField(
        u'What is your debt-to-income ratio? (round to 2 decimals)',
        validators=[DataRequired()])
    descr_input = StringField(
        u'Why do you need this loan? (enter text)',
        validators=[DataRequired()])
    submit = SubmitField('Submit')


@app.route('/', methods=['GET', 'POST'])
def index():
    # Set form
    form = ApplicationForm(request.form)
    # Form submission
    if request.method == 'POST' and form.validate_on_submit():
        session['emp_length_cat_input'] = form.emp_length_cat_input.data
        session['home_status_input'] = form.home_status_input.data
        session['zip3_input'] = form.zip3_input.data
        session['total_acc_input'] = form.total_acc_input.data
        session['annual_inc_input'] = form.annual_inc_input.data
        session['dti_input'] = form.dti_input.data
        session['descr_input'] = form.descr_input.data
        with db.connect() as conn:
            conn.execute(
                """INSERT INTO
                    loans_tbl (
                        emp_length_cat,
                        home_status,
                        zip3,
                        total_acc
                        annual_inc,
                        dti,
                        descr)
                VALUES (%s,%s,%s,%s,%s,%s,%s)""",
                (emp_length_cat_input, home_status_input, zip3_input,
                 total_acc_input, annual_inc_input, dti_input, descr_input)
            )
        db.session.commit()
        flash('Thanks for applying')
        return redirect(url_for('index'))
    return render_template('index.html',
                           form=form,
                           emp_length_cat_input=session.get('emp_length_cat_input'),
                           home_status_input=session.get('home_status_input'),
                           zip3_input=session.get('zip3_input'),
                           total_acc_input=session.get('total_acc_input'),
                           annual_inc_input=session.get('annual_inc_input'),
                           dti_input=session.get('dti_input'),
                           descr_input=session.get('descr_input')
                           )
<form method="POST" action="" novalidate>
                {{ form.hidden_tag() }}
                {{ form.emp_length_cat_input.label }} {{ form.emp_length_cat_input(id='emp_length_cat') }} </br>
                {{ form.home_status_input.label }} {{ form.home_status_input(id='home_status') }} </br>
                {{ form.zip3_input.label }} {{ form.zip3_input(id='zip3') }} </br>
                {{ form.total_acc_input.label }} {{ form.total_acc_input(id='total_acc') }} </br>
                {{ form.annual_inc_input.label }} {{ form.annual_inc_input(id='annual_inc') }} </br>
                {{ form.dti_input.label }} {{ form.dti_input(id='dti') }} </br>
                {{ form.descr_input.label }} {{ form.descr_input(id='descr') }} </br>
                {{ form.submit() }}
            </form> 

【问题讨论】:

    标签: flask flask-sqlalchemy flask-wtforms


    【解决方案1】:

    如果您打算将表单用作 POST 方法,您只需在模板内的表单中放置一个按钮即可提交到表单,这应该会发送一个 POST 请求,该请求将是您提交的表单。

    <form method="post">
        ...
        <button type="submit">Submit</button>
    </form>
    

    【讨论】:

      【解决方案2】:

      您必须指定按钮的类型。我解决了这样的问题

      class ApplicationForm(FlaskForm):
          ...
          submit = SubmitField(
                          'Submit',
                           render_kw={'type':'submit'})
      

      而且你需要修复动作路径

      <form method="POST" action="/">
      

      【讨论】:

        【解决方案3】:

        更新: 我相信我的提交按钮有问题。我使用{{ wtf.quick_form(form) }} 来渲染表单并且它有效!谢谢。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多