python - wtforms隐藏字段值

标签 python wtforms

我正在使用 WTForms,我遇到了隐藏字段不返回值的问题,而文档说它们应该返回值。这是一个简单的例子:

表单.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只是把label,field和errors放在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 blah blah', 'fld1': u''}

我做错了什么?

最佳答案

我怀疑您的隐藏字段是 (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 的值。

关于python - wtforms隐藏字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13619558/

相关文章:

php - 从 php 运行 python 脚本

python - Tensorflow 错误 : ValueError: Shapes must be equal rank, 但 2 和 1 来自合并形状 1 与其他形状

sqlalchemy - 带有 SQLAlchemy 模型的 WTForms 中的唯一验证器

python - 具有多个相同行的表格

python - 网络抓取具有通过ajax加载的动态内容的网页

python - 屏幕抓取时处理 javascript 重页面的选项

python - 从字符串中删除尾随空格的 pythonic 方法是什么?

python - WTForms render_field() 方法引用 for 循环变量

python - WTForms:同一页面上的两种形式?

python - 如何跟踪 Flask-WTF 中的表单字段变化?