wtforms скрытое значение поля
Я не программист, поэтому, пожалуйста, будьте нежны со мной. Я использую WTForms, довольно успешно, но у меня проблема со скрытыми полями, не возвращающими значения, тогда как документы говорят, что они должны. Я построил простой пример, надеюсь, это ясно;
forms.py:
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 tags)
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-целое поле автоинкремента. Форма заполняется этими данными, поэтому, если я запускаю experiment.py, когда я представляю форму, я получаю:
{'fld2': u'Blah blah,' fld1': u' 1'}
но если я изменю fld1 на HiddenField, когда я нажму submit, я получу: {'fld2': у'blah бла бла', 'fld1': у"}
что я делаю не так? Спасибо в предвкушении.
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': у юристов', 'fld1': у'foo'} как я хотел ожидать.
проверьте, что mydata имеет атрибут "fld1" и имеет значение. Я мог бы установить его явно как form = TestForm (request.значения, obj=mydata) - не похоже, что WTForms будет заботиться, но я получил ожог от того, что он иногда странно придирчив.
Если это не работает для вас, вернитесь и опубликуйте свой HTML и какие значения имеют mydata.