【发布时间】:2020-06-03 00:43:14
【问题描述】:
我在两个不同的视图中使用 WTForm 时遇到问题。一个视图使用表单数据创建一个新项目。另一个视图显示数据库中已有项目的信息,用户应该能够从那里更新表单数据。
我可以创建和查看数据库中的项目。问题是在显示视图中更新信息。我采取的步骤如下:
-
在
/create中创建一个项目。在保存到数据库之前,请检查数据库中是否存在相同的 ID。如果存在则显示闪烁并且不允许保存该项目。正在重新加载/create -
要显示有关现有项目的信息,路由
/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>。
请有人指出我正确的方向。谢谢大家!
【问题讨论】:
-
请添加您的html表单,可能问题出在您的表单操作上
-
你问对了问题。检查了 python 和 js 并假设 html 是好的。当我构建
/create时,我在表单中添加了一个操作,却忘记将其删除。
标签: python flask flask-wtforms wtforms