在两个不同的视图中使用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>
。
请有人指出我正确的方向。谢谢大家!
答案 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>