使用wtforms SelectField从表单中获取选定的文本

时间:2014-01-19 13:39:15

标签: python flask wtforms

这是关于使用wtforms SelectField的问题。

提交表单后,我希望提取所选文本。

我有以下表格:

from wtforms import Form, SelectField
class TestForm(Form):
     hour = SelectField(u'Hour', choices=[('1', '8am'), ('2', '10am') ])

以下是观点:

@app.route('/', methods=['GET', 'POST'])
def test_create():
form =TestForm(request.form)
if request.method == 'POST' and form.validate():
    test = Test()
    form.populate_obj(test)
    test.hour=form.hour.name
    db.session.add(test)
    db.session.commit()
    return redirect(url_for('test_create'))
return render_template('test/edit.html', form=form)

使用test.hour=form.hour.name我获取属性name(毫不奇怪......),同时我需要文本(如果选择了第一个选项,请说8am)。

这怎么可能?谢谢你的提示。

5 个答案:

答案 0 :(得分:8)

在表单中定义全局选择:

HOUR_CHOICES = [('1', '8am'), ('2', '10am')]

class TestForm(Form):
     hour = SelectField(u'Hour', choices=HOUR_CHOICES)

从表单导入它,将其转换为dict:

from .forms import HOUR_CHOICES

hour_display = dict(HOUR_CHOICES).get(form.hour.data)

答案 1 :(得分:4)

作为评论回答了,所以我在这里写。

使用form.hour.data获取值而不是名称。

答案 2 :(得分:2)

如果您不需要选择索引,则更简单:

class TestForm(Form):
  hour = SelectField(u'Hour', choices=[('8am', '8am'), ('10am', '10am') ])

答案 3 :(得分:1)

另一个选择是从form.hour.data获取索引并像这样调用它:

import math
import bitstring

s = """
module log10(
   input  wire [9:0]  x,
   output reg  [32:0] y
);

always @*
case (x)
"""

for i in range(1, 1024):

    # this will give you 32b floating point, not 8b fixed
    # point but you can figure that part out

    s += str(i) + ": y = 32'b" + bitstring.BitArray(float=math.log10(i), length=32).bin + ";\n"

s += """
default: y = 32'hdeadbeef;
endcase
endmodule
"""

print(s)

答案 4 :(得分:0)

当您设置选项时,列表看起来像[(index, value),...],因此您不需要导入它,如果动态设置,则可能不应该

value = dict(form.hour.choices).get(form.hour.data)

如果在表单类

中替换自己的表单

一般来说,我经常压缩选择,因此索引和值是相同的。但是,有时我想要显示比感兴趣的值更短的显示选择。在这种情况下,我认为它像[(value, display),...],然后数据变量感兴趣的值。例如,[(abspath, basename), ...]