[英]WTForm used in two different views validate only using one view
我在兩個不同的視圖中使用 WTForm 時遇到問題。 一個視圖使用表單數據創建一個新項目。 另一個視圖顯示數據庫中已有項目的信息,用戶應該能夠從那里更新表單數據。
我可以創建和查看數據庫中的項目。 問題是在顯示視圖中更新信息。 我采取的步驟是這樣的:
在/create
中創建一個項目。 在保存到數據庫之前,請檢查數據庫中是否存在相同的 ID。 如果存在,則顯示 flash 並且不允許保存該項目。 重新加載/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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.