在两个不同视图中使用的WTForm仅使用一个视图进行验证

时间:2020-06-03 00:43:14

标签: python flask flask-wtforms wtforms

在两个不同的视图中使用WTForm时遇到问题。一个视图使用表单数据创建一个新项目。另一个视图显示数据库中已有项目的信息,用户应该能够从中更新表单数据。

我可以创建和查看数据库中的项目。问题在于在显示视图中更新信息时。我采取的步骤类似于:

  1. /create中创建一个项目。保存到数据库之前,请检查数据库中是否尚未存在相同的ID。如果存在,请显示闪光灯,不允许保存该项目。重新加载/create

  2. 要显示有关现有项目的信息,请使用路线/display/<item>调用数据库,填充表格并使用相同的表格显示信息。

期望的行为

/display/<item>中更新信息。更新任何字段数据并按提交按钮后,该表单应保存到数据库并重新加载/display/<item>

实际行为

按下提交按钮后,表单将我带回到/create路线,并执行ID验证。

我不明白为什么在另一个视图/display/<item>中,表单的“提交”按钮会将我带到/create视图。


代码如下:

这是一个简单的表格

    class ItemForm(FlaskForm):
        id = IntegerField("id", validators=[DataRequired()])
        name = StringField("Email", validators=[DataRequired()])
        submit = SubmitField("Submit")

以此,我在数据库中创建一个新项目,检查数据库中是否没有相同的ID:

    @app.route("/create", methods=["GET", "POST"])
    def create():
        form = ItemForm()

        if form.validate_on_submit():
            item = item = Item.query.filter(Item.id == form.id).first()
            # Check the same id is not already created
            if item is not None:
                flash('item already in database')
                return redirect(url_for("create"))

            item = Item()
            form.populate_obj(item)
            db.session.add(item)
            db.session.commit()
            return redirect(url_for("display", item = form.id))
        else:
            return render_template("create.html", form=form)

然后在数据库中创建项目之后,我可以调用显示路线。在此路由中,我应该能够更新表单中的字段并将其保存到数据库中。可以进行验证,因为数据库中已经存在相同的ID(我正在更新,没有创建新的ID)。

@app.route("/display/<item>", methods=["GET", "POST"])
def display(item):
    item = Item.query.filter(Item.id == item).first()
    form = ItemForm(obj=item)

    if form.validate_on_submit():
        form.populate_obj(item)
        db.session.add(item)
        db.session.commit()
        return redirect(url_for("display", item=form.id))
    else:
        return render_template("display.html", form=form)

问题在于,在/display/<item>路由中,“提交”按钮将我带回到/create路由。在此处执行验证。当然,该项目已经在数据库中创建,因此我可以获取闪存,并在应重新加载/create时将我重定向到/display/<item>

请有人指出我正确的方向。谢谢大家!

1 个答案:

答案 0 :(得分:1)

我的错,但是@the_gañañufla提出了正确的问题。单独编码的问题。

我已经在HTML中添加了一个动作,却忘记删除它。

我有


<form id="form_item" action="{{ url_for('create') }}" class="form" method=post>

更正后,我有:

<form id="form_product" action="" class="form" method=post>