簡體   English   中英

在兩個不同視圖中使用的 WTForm 僅使用一個視圖進行驗證

[英]WTForm used in two different views validate only using one view

我在兩個不同的視圖中使用 WTForm 時遇到問題。 一個視圖使用表單數據創建一個新項目。 另一個視圖顯示數據庫中已有項目的信息,用戶應該能夠從那里更新表單數據。

我可以創建和查看數據庫中的項目。 問題是在顯示視圖中更新信息。 我采取的步驟是這樣的:

  1. /create中創建一個項目。 在保存到數據庫之前,請檢查數據庫中是否存在相同的 ID。 如果存在,則顯示 flash 並且不允許保存該項目。 重新加載/create

  2. 要顯示有關現有項目的信息,路由/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM