2012-11-29 29 views
10

私はプログラマーではないので、私と穏やかにしてください。私は非常にうまくWTFormsを使用していますが、値を返さない隠しフィールドに問題があります。私は簡単な例を作りました、これがはっきりしていることを望みます。wtforms hiddenフィールドの値

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タグ、ラベル、フィールドとエラーを置く)

実験.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は、2つのフィールドfld1とfld2を持つテーブルから唯一の行を返します。 fld1は整数の自動インクリメントフィールドです。フォームにそのデータが入力されているので、私がフォームを送信すると、experiment.pyを実行すると、次のように表示されます。

{'fld2': 'uldblah blah'、 'fld1':u'1 '}

しかし、私はのHiddenFieldにFLD1を変更した場合、私はヒット時に提出し、私が取得: { 'FLD2を':u'blah何とか何とか」、 'FLD1: '' U'}私が間違っているのは何

を?期待してくれてありがとう。

+0

は、テンプレートに隠しフィールドを明示的に追加する必要はないことを明らかにしただけで、フォームタグの直下にflask-wtfによって追加されます。 – jxramos

答えて

10

あなたの隠しフィールドが(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'} Iとして期待するだろう。

mydataに属性「fld1」があり、値があることを確認します。私はそれを明示的にform = TestForm(request.values、obj = mydata)のように設定するかもしれません - WTFormsが気にするようには見えませんが、時には奇妙なことに気付いてしまいました。

これがうまく行かない場合は、HTMLとmydataの値を返信して投稿してください。

+3

こんにちはRachel。あなたの答えをありがとう、ありがとうございます。それは価値を失っていたマクロでした。すべて今良い。 – SkinnyPete63

+0

素晴らしいです、私はうれしいです。 –

関連する問題