【问题标题】:How to insert conditional fields with WTForms?如何使用 WTForms 插入条件字段?
【发布时间】:2014-12-30 10:56:55
【问题描述】:

在我使用Flask 构建的网站中,我使用WTForms 进行表单验证。我目前有一个依赖于另一个字段的字段:如果用户插入特定年份(2012 年),则使用 Javascript 插入几个单选按钮。我将 RadioField 设置为可选的,效果很好,但如果我确实使用单选按钮提交表单,它的值仍然是 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' 的条目。

【问题讨论】:

  • 您是否将表单从视图传递到您的 JavaScript 代码所在的模板?
  • @boh - 是的,我做到了。所有其他字段都显示正常,并且返回正常。其他一切都运行良好。这只是一个回报不佳的领域。我怀疑是因为我使用js动态创建的,但我不知道这是不是真的,或者我如何解决它。
  • 您可以尝试使用 Flask 本身提供的 request.form['transfer_tax_rate'] 而不是使用 form.transfer_tax_rate.data。
  • 我创建了相同的表单,将{{ form.transfer_tax_rate() }} 删除并在浏览器中手动输入通常由flask-wtf 呈现的HTML 以模拟您的JS。一切正常。你应该看看你的 JS 代码。也许你没有正确插入 HTML 或者你拼错了我手动添加的代码。
  • @boh - 最后我解决了它,但这是一个非常奇怪的原因(请参阅下面的答案)。感谢您的时间和精力!

标签: python forms flask wtforms flask-wtforms


【解决方案1】:

好的,在我的头撞墙大约 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>

解决方案原来在于放置 &lt;form&gt; 标签,因为如果我像最后一段代码一样将它们移出表格,一切正常:

<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>

对不起,打扰了你们所有的男人和女孩,但没有提供所有相关信息。谢谢你给了我继续寻找的能量!

【讨论】:

    猜你喜欢
    • 2012-01-17
    • 2015-04-07
    • 2011-08-25
    • 2018-11-16
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多