私は WTForms を使用していますが、隠しフィールドが値を返さないという問題があります。ドキュメントには値が返されるはずだと書いてあります。簡単な例を次に示します。
フォーム:
from wtforms import (Form, TextField, HiddenField)
class TestForm(Form):
fld1 = HiddenField("Field 1")
fld2 = TextField("Field 2")
実験.html:
{% from "_formshelper.html" import render_field %}
<html>
<body>
<table>
<form method=post action="/exp">
{% for field in form %}
{{ render_field(field) }}
{% endfor %}
<input type=submit value="Post">
</form>
</table>
</body>
</html>
(render_field はラベル、フィールド、エラーを td タグに配置するだけです)
実験.py:
from flask import Flask, request, render_template
from templates.forms import *
from introspection import *
app = Flask(\__name__)
app.config.from_object(\__name__)
db_session = loadSession()
@app.route('/exp', methods=['POST', 'GET'])
def terms():
mydata = db_session.query(Peter).one()
form = TestForm(request.form, mydata)
if request.method == 'POST' and form.validate():
return str(form.data)
return render_template('experiment.html', form = form)
if __name__ == '__main__':
app.run(debug = True)
mydata は、fld1 と fld2 の 2 つのフィールドを持つテーブルから唯一の行を返します。fld1 は整数の自動増分フィールドです。フォームにはそのデータが入力されるため、experiment.py を実行してフォームを送信すると、次のようになります。
{'fld2': u'blah blah blah', 'fld1': u'1'}
しかし、fld1 を HiddenField に変更して送信すると、次のメッセージが表示されます: {'fld2': u'blah blah blah', 'fld1': u''}
何が間違っているのでしょうか?
ベストアンサー1
隠しフィールドには (1) 値が設定されていないか、(2) render_field マクロによって正しく構築されていないと思われます。 おそらく、「mydata」オブジェクトには期待した値がないのではないでしょうか。
私はあなたのコードを必要最小限にまで削減しましたが、これでうまくいきました。両方のフィールドに明示的に値を与えていることに注意してください。
from flask import Flask, render_template, request
from wtforms import Form, TextField, HiddenField
app = Flask(__name__)
class TestForm(Form):
fld1 = HiddenField("Field 1")
fld2 = TextField("Field 2")
@app.route('/', methods=["POST", "GET"])
def index():
form = TestForm(request.values, fld1="foo", fld2="bar")
if request.method == 'POST' and form.validate():
return str(form.data)
return render_template('experiment.html', form = form)
if __name__ == '__main__':
app.run()
そして
<html>
<body>
<table>
<form method=post action="/exp">
{% for field in form %}
{{field}}
{% endfor %}
<input type=submit value="Post">
</form>
</table>
</body>
</html>
これにより、予想どおり {'fld2': u'bar', 'fld1': u'foo'} が返されます。
mydata に属性 "fld1" があり、値があることを確認します。form = TestForm(request.values, obj=mydata) のように明示的に設定することもできます。WTForms は気にしないようですが、奇妙にうるさいので困ったことがあります。
それでもうまくいかない場合は、戻って HTML と mydata の値を投稿してください。