【问题标题】:FlaskForm validate_on_submit function always returns FalseFlaskForm validate_on_submit 函数总是返回 False
【发布时间】:2020-06-17 18:58:55
【问题描述】:

这是我的代码:

        # My Form
from flask_wtf import FlaskForm
from wtforms.validators import Length, InputRequired
from wtforms import StringField, SubmitField

class AddGradeForm(FlaskForm):
        name = StringField('Grade', validators=[InputRequired(), Length(min=4, max=20)])
        submit = SubmitField('Add')

 # My route
    @admin.route('/AddGrade', methods=['GET', 'POST']) # admin is my blueprint's name
    def add_grade():
        form = AddGradeForm()
        if form.is_submitted():
            return str(form.validate_on_submit()) # always returns False
             ...
            flash('New grade has been added', 'success')
            return redirect(url_for('grades'))
        return render_template('add_grade.html', form=form)
# Template
<form method="POST" action="">
                        {{ form.hidden_tag() }}
                            <!-- Second row -->
                            <div class="row">
                                <div class="col-12">
                                    <div class="form-group">
                                        {{ form.name.label(class="form-control-label") }}
                                        {% if form.name.errors %}
                                        {{ form.name(class="form-control is-invalid") }}
                                        <div class="invalid-feedback">
                                            {% for error in form.name.errors %}
                                            <span>{{ error }}</span>
                                            {% endfor %}
                                        </div>
                                        {% else %}
                                        {{ form.name(class="form-control") }}
                                        {% endif %}
                                    </div>
                                </div>
                            </div>

                            <div class="input-group mb-35  " style="vertical-align: middle;">
                                {{ form.submit(class="btn btn-outline-primary btn-block") }}
                            </div>
                        </form>

在我的本地服务器上 validate_on_submit() 完全按照我的预期工作,但在生产服务器上,validation_on_submit 函数总是返回 False(再次重定向到表单而没有验证错误)我不知道为什么!?。 请帮我找出这个错误我已经尝试了很多次但我找不到任何解决方案。

【问题讨论】:

    标签: flask flask-wtforms


    【解决方案1】:

    我看到了同样的错误,这对我有用:

    表格

    使用 Form 代替 FlaskForm

    路线

    • 在提供允许的方法时,使用括号 () 而不是括号 []
    • 检查表单是否已提交并验证使用: request.method == 'P0ST' 和 form.validate() 而不是 form.validate_on_submit() 因为我们不再使用 FlaskForm

    模板

    移除 form.hidden_​​tag 并改用 form.csrf.token

    以下是上述更改的代码:

    # My Form
    from wtforms import Form,StringField, SubmitField, validators
    
    class AddGradeForm(Form):  # replaced FlaskForm with Form
            name = StringField('Grade',[validators.InputRequired(), validators.Length(min=4, max=20)])
            submit = SubmitField('Add')
    
     # My route
        @admin.route('/AddGrade', methods=('GET', 'POST')) # change from [] to ()
        def add_grade():
            form = AddGradeForm()
            if request.method == 'POST' and form.validate():
                return str(form.validate_on_submit()) # now returns True
                 ...
                flash('New grade has been added', 'success')
                return redirect(url_for('grades'))
            return render_template('add_grade.html', form=form)
    # Template
    <form method="POST" action="">
                            {{ form.csrf_token }} <!-- from form.hidden_tag() to form.csrf_token -->
                                <div class="row">
                                    <div class="col-12">
                                        <div class="form-group">
                                            {{ form.name.label(class="form-control-label") }}
                                            {% if form.name.errors %}
                                            {{ form.name(class="form-control is-invalid") }}
                                            <div class="invalid-feedback">
                                                {% for error in form.name.errors %}
                                                <span>{{ error }}</span>
                                                {% endfor %}
                                            </div>
                                            {% else %}
                                            {{ form.name(class="form-control") }}
                                            {% endif %}
                                        </div>
                                    </div>
                                </div>
    
                                <div class="input-group mb-35  " style="vertical-align: middle;">
                                    {{ form.submit(class="btn btn-outline-primary btn-block") }}
                                </div>
    </form>
    

    【讨论】:

      猜你喜欢
      • 2013-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      相关资源
      最近更新 更多