Значение скрытого поля 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 возвращает единственную строку из таблицы, которая имеет 2 поля, fld1 и fld2. fld1 - целое поле автоинкремента. Форма заполнена этими данными, поэтому, если я запустил эксперимент .py, когда я отправлю форму, я получаю:

{'fld2': u'blah blah blah ',' fld1 ': u'1'}

Но если я сменил fld1 на HiddenField, когда я попал в submit, я получаю: {'fld2': u'blah blah blah ',' fld1 ': u' '}

Что я делаю неправильно? Спасибо в ожидании.

Ответ 1

Я подозреваю, что ваше скрытое поле либо (1) не получает значение, либо (2) макрос рендеринга не строит его правильно. Если бы мне пришлось делать ставки, я бы сказал, что ваш объект 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.