2012-11-29 58 views
10

我不是程序员,所以请对我温柔。我正在使用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标签的标签,现场和错误)

实验.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':u'blah blah blah','fld1':u'1'}

但是,如果我改变FLD1到HiddenField,当我点击提交,我得到: { 'FLD2':u'blah等等等等”, 'FLD1':U ''}

我在做什么错?感谢预期。

+0

刚才了解到,显然我们甚至不需要向模板显式添加隐藏字段,它们会通过flask-wtf正好在“form”标签下添加。 – 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'}我会期待。

检查mydata是否有属性“fld1”并且它有一个值。我可能会明确地将它设置为form = TestForm(request.values,obj = mydata) - 它看起来并不像WTForms那样在意,但我有时被它怪异地挑剔所灼伤。

如果这不适用于您,请返回并发布您的HTML以及mydata具有的值。

+3

嗨,雷切尔。感谢您的回答,并且非常及时。这是宏观失去价值。现在都好。 – SkinnyPete63

+0

太棒了,我很高兴。 –