在两个不同的视图中使用的WTForm只在一个视图中生效

问题描述 投票:0回答:1

我在两个不同的视图中使用风电表格时遇到了一个问题。一个视图使用表单数据创建一个新的项目,另一个视图显示数据库中已有项目的信息,用户可以从那里更新表单数据。另一个视图显示已经在数据库中的项目信息,用户应该可以从那里更新表单数据。

我可以在数据库中创建和查看项目。问题是在显示视图中更新信息。我采取的步骤是这样的。

  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 途径。在那里进行验证。当然,项目已经在数据库中创建了,所以我得到了flash,我被重定向到了 /create,当它应该重新加载 /display/<item>.

谁能给我指点一下方向,谢谢。谢谢大家!我在两个不同的视图中使用风电表格时遇到了问题。

python flask flask-wtforms wtforms
1个回答
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>
© www.soinside.com 2019 - 2024. All rights reserved.