【问题标题】:WTForm used in two different views validate only using one view在两个不同视图中使用的 WTForm 仅使用一个视图进行验证
【发布时间】:2020-06-03 00:43:14
【问题描述】:

我在两个不同的视图中使用 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/&lt;item&gt; 路由中时,提交按钮将我带回/create 路由。在那里执行验证。当然,该项目已经在数据库中创建,所以我得到了闪存,我被重定向到 /create,它应该重新加载 /display/&lt;item&gt;

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

【问题讨论】:

  • 请添加您的html表单,可能问题出在您的表单操作上
  • 你问对了问题。检查了 python 和 js 并假设 html 是好的。当我构建/create 时,我在表单中添加了一个操作,却忘记将其删除。

标签: python flask flask-wtforms wtforms


【解决方案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>

【讨论】:

    猜你喜欢
    • 2016-02-12
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 1970-01-01
    相关资源
    最近更新 更多