首页 > 解决方案 > WTF form.validate_on_submit() 在更新表单时不起作用

问题描述

我设计了一个表格来更新任务。该表单会将任务的详细信息放入更新表单中,并且在提交该表单时form.validate_on_submit不起作用并再次重定向到具有先前值的相同表单。这是我的路线和模板代码。我用过{{ form.csrf_token }}。但类似的逻辑适用于 newTask 路由。

更新路线

@main.route('/update/<int:id>',methods=['POST','GET'])
@login_required
def update(id):
    if form.validate_on_submit():
        t.task_name = form.task_name.data
        t.assignee = form.assignee.data
        t.deal_size = form.deal_size.data
        t.lead_status = form.lead_status.data
        t.stage = form.stage.data
        t.priority = form.priority.data
        t.submission_date = form.date.data
        db.session.add(t)
        db.session.commit()
        return redirect('/')
    form = NewTaskForm()
    t = Tasks.query.get_or_404(id)
    return render_template("update.html",form = form , t = t)

更新.html

<form method="POST" action="/update/{{ t.id }}">
            {{ form.csrf_token }}
            <div class="form-group">
                {{ form.task_name.label }}{{ form.task_name(class='form-control',value = t.task_name ) }}
                {% if form.task_name.errors %}
                    {% for error in form.task_name.errors %}
                        <div class="alert alert-danger" role="alert">
                            {{ error }}
                        </div>
                    {% endfor %}
                {% endif %}
            </div>
            <div class="form-group">
                {{ form.assignee.label }}{{ form.assignee(class='form-control',value = t.assignee) }}
                {% if form.assignee.errors %}
                    {% for error in form.assignee.errors %}
                        <div class="alert alert-danger" role="alert">
                            {{ error }}
                        </div>
                    {% endfor %}
                {% endif %}
            </div>
            <div class="form-group">
                {{ form.deal_size.label }}{{ form.deal_size(class='form-control',value = t.deal_size) }}
                {% if form.deal_size.errors %}
                    {% for error in form.deal_size.errors %}
                        <div class="alert alert-danger" role="alert">
                            {{ error }}
                        </div>
                    {% endfor %}
                {% endif %}
            </div>
            <div class="form-group">
                {{ form.lead_status.label }}{{ form.lead_status(class='form-control',value = t.lead_status) }}
                {% if form.lead_status.errors %}
                    {% for error in form.lead_status.errors %}
                        <div class="alert alert-danger" role="alert">
                            {{ error }}
                        </div>
                    {% endfor %}
                {% endif %}
            </div>
            <div class="form-check padding-none">
                {{ form.stage.label(class='form-check-label') }}{{ form.stage(class='form-check-input customRadio',value = t.stage.data) }}
                {% if form.stage.errors %}
                    {% for error in form.stage.errors %}
                        <div class="alert alert-danger" role="alert">
                            {{ error }}
                        </div>
                    {% endfor %}
                {% endif %}
            </div>
            <div class="form-group">
                {{ form.date.label }}{{ form.date(class='form-control',value = t.submission_date.date()) }}
                {% if form.date.errors %}
                    {% for error in form.date.errors %}
                        <div class="alert alert-danger" role="alert">
                            {{ error }}
                        </div>
                    {% endfor %}
                {% endif %}
            </div>
            {{ form.submit(class="btn btn-outline-primary btn-block") }}
        </form>

新任务路线

@main.route('/new-task',methods=['POST','GET'])
@login_required
def newTask():
    form = NewTaskForm()
    if form.validate_on_submit():
        t = Tasks()
        t.task_name = form.task_name.data
        t.assignee = form.assignee.data
        t.deal_size = form.deal_size.data
        t.lead_status = form.lead_status.data
        t.stage = form.stage.data
        t.priority = form.priority.data
        t.submission_date = form.date.data
        db.session.add(t)
        db.session.commit()
        return redirect('/')
    return render_template("newtask.html",form = form)

标签: pythonflaskflask-wtformswtforms

解决方案


如果要将用户重定向到新表单,请使用:

@main.route('/update/<int:id>',methods=['POST','GET'])
@login_required
def update(id):
    if form.validate_on_submit():
        # do something and then redirect
        return redirect(url_for('confirm'))
    return render_template("update.html",form = form , t = t)

如果您还没有完成,您可能需要为“确认站点”创建一个新功能。如果您想更好地了解 url_for ,可以查看烧瓶文档:

它接受函数的名称作为其第一个参数和任意数量的关键字参数,每个关键字参数对应于 URL 规则的可变部分。未知的可变部分作为查询参数附加到 URL。

在这里您也可以找到一个很好的解释: create-dynamic-urls-in-flask


推荐阅读