如何使用WTForms插入条件字段?

时间:2014-11-03 17:59:45

标签: python forms flask wtforms flask-wtforms

在我使用Flask构建的网站中,我使用WTForms进行表单验证。我目前有一个依赖于另一个字段的字段:如果用户插入特定年份(2012),则使用Javascript插入几个单选按钮。我使RadioField可选,它工作正常,但如果我确实提交了带有radiobuttons的表单,它的值仍为None

谈谈一些代码;两个相关的表单字段定义如下:

construction_year = IntegerField('construction_year')
transfer_tax_rate = SelectField('transfer_tax_rate', validators=[Optional()], choices=[('ZERO', '0%'), ('SIX', '6%')])

我在模板中首次使用的代码显示construction_yeartransfer_tax_rate如下:

{{ form.construction_year(size=10) }}
{{ form.transfer_tax_rate() }}

这很好用;我可以打印出后端的值,如下所示:

if form.validate_on_submit():
    print form.construction_year.data  # prints out '2012'
    print form.transfer_tax_rate.data  # prints out ZERO or SIX depending on my choice

然后我删除了{{ form.transfer_tax_rate() }}并编写了一些Javascript,如果construction_year是2012,则插入一些html:

function displayTransferTaxRate(){
    var year = $("#construction_year").val();
    var propertyType = $("#property_type").val();
    if (year.length == 4 && year == 2012) {
        var transferTaxRateHtml = 'Applicable tax rate <select id="transfer_tax_rate" name="transfer_tax_rate"><option value="ZERO">0%</option><option value="SIX">6%</option></select>';
        $('#transfer-tax-rate-div').html(transferTaxRateHtml);
    } else {
        $('#transfer-tax-rate-div').html('');
    }
}
$("#construction_year").on('keyup paste', displayTransferTaxRate);

易于阅读;它插入的html如下:

<select id="transfer_tax_rate" name="transfer_tax_rate">
    <option value="ZERO">0%</option>
    <option value="SIX">6%</option>
</select>

html插入正常,我可以选择其中一个选项。但是当我提交表单并尝试获取transfer_tax_rate的值时,它总是打印出None

if form.validate_on_submit():
    print form.construction_year.data  # prints out '2012'
    print form.transfer_tax_rate.data  # prints out None

有没有人知道我在这里做错了什么?欢迎所有提示!

[编辑] 根据下面的user3147268提示,我也尝试从标准烧瓶request.form中获取,但这也不包含'transfer_tax_rate'的条目。

1 个答案:

答案 0 :(得分:3)

好吧,经过大约5个小时的撞击我的头后,我会回答我自己的问题,因为你们不可能知道这一点。

事实证明,它与嵌入此表单的表有关。我把这些信息遗漏了,因为我没想到会有相关信息。

所以这很好用:

<table>
    <form action="" method="post" id="prop-form">
        {{ form.hidden_tag() }}
        <tr>
            <td>Construction year: </td>
            <td>
                {{ form.construction_year(size=10) }}
            </td>
        </tr>
        <tr>
            <td>Transfer tax rate: </td>
            <td>
                {{ form.transfer_tax_rate()
            </td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="Save property"></td>
        </tr>
    </form>
</table>

但是当我在这个div中添加完全相同的html时,它不再起作用了:

<table>
    <form action="" method="post" id="prop-form">
        {{ form.hidden_tag() }}
        <tr>
            <td>Construction year: </td>
            <td>
                {{ form.construction_year(size=10) }}
                <div id="transfer-tax-rate-div"></div>
            </td>
        </tr>
        <tr>
            <td></td>
            <td><input type="submit" value="Save property"></td>
        </tr>
    </form>
</table>

然而,如果没有桌子,它确实有效:

<form action="" method="post" id="prop-form">
{{ form.hidden_tag() }}
Construction year: {{ form.construction_year(size=10) }} <br />
<div id="transfer-tax-rate-div"></div>
<input type="submit" value="Save property">
</form>

解决方案最终代表了<form>标签的位置,因为如果我将它们移出桌面,就像最后一段代码一样,它一切正常:

<form action="" method="post" id="prop-form">
{{ form.hidden_tag() }}
<table>
    <tr>
        <td>Construction year: </td>
        <td>
            {{ form.construction_year(size=10) }}
            <div id="transfer-tax-rate-div"></div>
        </td>
    </tr>
    <tr>
        <td></td>
        <td><input type="submit" value="Save property"></td>
    </tr>
</table>
</form>

请原谅我打扰你们所有人和女孩的时间,同时不提供所有相关信息。感谢您给我留下精力继续寻找!