web-dev-qa-db-ja.com

送信後、有効なフォームをクリアしてください

検証後にフォームをリセットしたい。現在、フォームは送信されて有効になった後も以前のデータを表示します。基本的には、すべてのフィールドをクリーンにしてフォームを元の状態に戻したいと思います。これを行うための正しいことは何ですか?

@mod.route('/', methods=['GET', 'POST'])
def home():
    form = NewRegistration()

    if form.validate_on_submit():
        #save in db

        flash(gettext(u'Thanks for the registration.'))

    return render_template("users/registration.html", form=form)
13
user455318

問題は、データが検証されて処理された場合でも、渡されたデータを使用してフォームを常にレンダリングしていることです。さらに、ブラウザは最後のリクエストの状態を保存するため、この時点でページを更新すると、ブラウザはフォームを再送信します。

成功したフォームリクエストを処理した後、ページにリダイレクトして新しい状態を取得します。

@app.route('/register', methods=['GET', 'POST'])
def register():
    form = RegistrationForm()

    if form.validate_on_submit():
        # do stuff with valid form
        # then redirect to "end" the form
        return redirect(url_for('register'))

    # initial get or form didn't validate
    return render_template('register.html', form=form)
27
davidism

デビディズムの答えは正しいです。

しかし、一度リセットする必要のあるフィールドがいくつかあるフォームをリロードする必要がありました。だから、私はこれをしました、多分それは最もきれいな方法ではありませんが、それは私のために働きました:

form = MyForm()

    if form.validate_on_submit():
        # save all my data...
        myvar1 = form.field1.data
        myvar2 = form.field2.data
        # etc...

    # at first GET and at every reload, this is  what gets executed:
    form.field1.data = "" # this is the field that must be empty at reload
    form.field2.data = someobject # this is a field that must be filled with some value that I know

    return render_template('mypage.html', form=form)
0
axeda