web-dev-qa-db-ja.com

wtforms隠しフィールド値

WTFormsを使用していますが、非表示のフィールドが値を返さないという問題がありますが、ドキュメントにはそうすべきであると書かれています。以下に簡単な例を示します。

forms.py:

from wtforms import (Form, TextField, HiddenField)

class TestForm(Form):
    fld1 = HiddenField("Field 1")
    fld2 = TextField("Field 2")

experiment.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タグに配置するだけです)

experiment.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' '}

私は何が間違っているのですか?

12
SkinnyPete63

非表示フィールドが(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の値を投稿してください。

13
Rachel Sanders