首页 > 解决方案 > Flask WTForm:提交按钮不会产生错误

问题描述

我使用了相同的表单来提交,并且它在过去一直有效。提交按钮现在不起作用,因此 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> 

标签: flaskflask-sqlalchemyflask-wtforms

解决方案


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

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

你需要修复动作路径

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

推荐阅读