Python 两个不同视图中使用的WTForm仅使用一个视图进行验证
我在两个不同的视图中使用WTForm时遇到问题。一个视图使用表单数据创建一个新项。另一个视图显示数据库中已有项目的信息,用户应该能够从中更新表单数据 我可以在数据库中创建和查看项目。问题是在显示视图中更新信息。我采取的步骤如下:Python 两个不同视图中使用的WTForm仅使用一个视图进行验证,python,flask,flask-wtforms,wtforms,Python,Flask,Flask Wtforms,Wtforms,我在两个不同的视图中使用WTForm时遇到问题。一个视图使用表单数据创建一个新项。另一个视图显示数据库中已有项目的信息,用户应该能够从中更新表单数据 我可以在数据库中创建和查看项目。问题是在显示视图中更新信息。我采取的步骤如下: 在/Create中创建项目。在保存到数据库之前,请检查数据库中是否没有相同的ID。如果存在,则显示闪光灯,不允许保存项目。重新加载/create 要显示有关现有项目的信息,请调用数据库,填充表单并使用相同的表单显示信息 期望行为 在/display/中更新信息。更新
/Create
中创建项目。在保存到数据库之前,请检查数据库中是否没有相同的ID。如果存在,则显示闪光灯,不允许保存项目。重新加载/create
/display/
中更新信息。更新任何字段数据并按下提交按钮后,表单应保存到数据库并重新加载/display/
实际行为
按下提交按钮后,表单将我带回/create
路径,并执行ID验证
我不明白为什么在不同的视图中,表单的提交按钮将我带到/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/”,方法=[“GET”,“POST”])
def显示(项目):
item=item.query.filter(item.id==item.first()
表格=项目表格(obj=项目)
if form.validate_on_submit():
表格.填充对象(项目)
db.session.add(项)
db.session.commit()
返回重定向(url_用于(“显示”,item=form.id))
其他:
返回渲染模板(“display.html”,form=form)
问题是,在/display/
路线中,提交按钮会将我带回/create
路线。在那里执行验证。当然,该项已经在数据库中创建,因此我得到了flash,并被重定向到/create
,此时它应该重新加载/display/
请有人给我指一下正确的方向好吗。谢谢大家! 我错了,但“乌加尼亚涅夫拉”提出了正确的问题。单独编码的问题 我在HTML中添加了一个操作,但忘记删除它 我有
更正后,我有:
请添加您的html表单,可能问题出在表单的操作上您只需提出正确的问题。检查python和js,并假设html是正常的。当我构建/create
时,我在表单中添加了一个操作,但忘了删除它。
@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)