2017-02-02 3 views
0

EDITED私の元々の質問は十分ではなかった。私は、ユーザーがwtformsでTextFieldに値を渡すことを許可したい、そして、それらが追加された後に入力された値が表示されます。これにより、ユーザーは複数の値を渡してから、元々入力されたすべての値に対して最後の「Sumbit」ボタンを押すことができます。テキストボックスからデータをwtformに渡してブラウザで表示します。

私は入力したテキストで何かをするためのthis questionを見つけました。これは私が試みたものです。

私のPythonコード:

from flask import Flask, request, render_template, redirect 
from wtforms import TextField, Form, SubmitField 


def redirect_url(default='index'): 
    return request.args.get('next') or \ 
      request.referrer or \ 
      url_for(default) 


class RegionForm(Form): 
    field = TextField('Region') 
    Submit = SubmitField('AddRegion') 
    fieldList = [] 


def main(): 
    app = Flask(__name__) 

    @app.route('/region/', methods=['GET']) 
    def region(): 
     form = RegionForm(request.form) 

     return render_template("region.html", 
           form=form) 


    @app.route('/add/', methods=['POST']) 
    def add(): 
     request.form['fieldList'].append(request.form['field']) 
     return redirect(redirect_url()) 

    app.run(debug=True) 

私のhtmlコード:

<form action="/add/" method="Post"> 
{% for field in form %} 
    <tr> 
     <th>{{ field.label }}</th> 
     <td>{{ field }}</td> 
    </tr> 
{% endfor %} 
</form> 
{% for item in form.fieldList %} 
    {{ item }} 
{% endfor %} 

しかし、私はテキストを入力し、 "AddRegion" ボタンをクリックした後、私は次のエラーを取得する:The browser (or proxy) sent a request that this server could not understand.をただし、私はrequest.form['fieldList'].append(request.form['field'])行をコメントアウトし、リダイレクトが発生しますが、テキストはフォームの隠しリストに追加されていません。どうすればいいですか?をテキストに追加してをリダイレクトすると、ユーザーはさらにテキストを追加できますか?残りはうまく動作するので、この行だけにエラーがあるように思われます。

フィールドにテキストを動的に追加し、そのフィールドをブラウザに表示させるにはどうすればよいですか? その後、完全な領域フィールドが追加されたら、後で別の関数で処理するためにそのリストを取得できるようにします。

答えて

0

第一部

だからあなたのコードを見た後、私は私はあなたの問題を発見したと思います。フラスコは、そのアプリのルートに非常に特有です。あなたのフラスコに持って

アプリルートは次のとおりです。

@app.route('/add', methods=['POST']) 

しかし、あるフォーム上のあなたの現在のアクション:フラスコ/add<form action="/add/" method="Post">

/add/は、実際には2つの異なるWEB-ですルート。したがって、@app.routeがトリガーされていません。コードを次のように変更した場合:

`<form action="/add" method="post">` 

ここから進んでください。

第二部

私は、追加の問題があるかもしれないと思います。だからあなたのHTML内でfieldListのアイテムをループする前に実際に</form>タグを閉じてください。

</form> {% for item in form.fieldList %} {{ item }} {% endfor %}

試してみてください。私が起こっされると信じて何

{% for item in form.fieldList %} {{ item }} {% endfor %} </form>

は、フォームの入力が実際にそう、あなたが取得しているそれらにアクセスしようとすると、フォームの内側に配置されていないということですa KeyError

+0

グッドキャッチ、私はまだ同じエラーを取得しています。 'request.form ['fieldList'] ... ...'で行をコメントアウトすると、うまく動作しますが、フォームを非表示にしたいのと同じ形で入力を追加しません。 – unasalusvictis

0

I秒何コーディマイヤーズは述べています。しかし、あなたが後でそれらをを変更した場合でも、正しいルートにを保証するための簡単な方法があります:フォームの使用action="{{ url_for('region') }}"、フラスコに自動的に与えられた関数名の正しいルートを代用します。

関連する問題