我在两个不同的视图中使用风电表格时遇到了一个问题。一个视图使用表单数据创建一个新的项目,另一个视图显示数据库中已有项目的信息,用户可以从那里更新表单数据。另一个视图显示已经在数据库中的项目信息,用户应该可以从那里更新表单数据。
我可以在数据库中创建和查看项目。问题是在显示视图中更新信息。我采取的步骤是这样的。
在数据库中创建一个项目 /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
途径。在那里进行验证。当然,项目已经在数据库中创建了,所以我得到了flash,我被重定向到了 /create
,当它应该重新加载 /display/<item>
.
谁能给我指点一下方向,谢谢。谢谢大家!我在两个不同的视图中使用风电表格时遇到了问题。
我的错误,但@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>