【问题标题】:Append form from template using WTForms FieldList and Ajax使用 WTForms FieldList 和 Ajax 从模板追加表单
【发布时间】:2014-03-06 23:48:36
【问题描述】:

我正在尝试使用创建动态表单(在 python Flask 应用程序中) WTForms。

WTForms 包含一个用于字段列表的 FieldList 字段。我想用它来制作一个用户可以添加或删除项目的表单,例如指定不同的电话号码。

这是一个使用 Ajax 和 WTForms 的 example of a WTF solutionrelated question。这些克隆了一个现有的表单,因此只有在至少已经存在一个表单实例的情况下才有效。我想删除此约束以允许最初为空的表单。

我想使用javascript form plugin called SheepIt 来动态添加/删除允许这样做的小部件,使用 html 中的“表单模板”。

问题是如何替换“表单模板”中的自定义html如:

<input id="phoneForm_#index#_number"
name="user[phones][#index#][number]" type="text"

带有 WTF 表单字段,例如:

{% for phone in form.phones %}
  {{ phone.number }}
{% endfor %}

允许 WTF 的好处,例如打印表单验证错误等。 这里的问题是,当使用 SheepIt 中的“模板表单”时,我不知道是否/在哪里放置上述 for 循环。

【问题讨论】:

    标签: javascript ajax flask wtforms flask-wtforms


    【解决方案1】:

    Flask 的文档建议使用以下 jinja2 宏来呈现 WTForms 字段:

    {% macro render_field(field) %}
      <dt>{{ field.label }}
      <dd>{{ field(**kwargs)|safe }}
      {% if field.errors %}
        <ul class=errors>
        {% for error in field.errors %}
          <li>{{ error }}</li>
        {% endfor %}
        </ul>
      {% endif %}
      </dd>
    {% endmacro %}
    

    为了在字段列表中呈现子字段,我使用了这个宏的一个稍微不同的版本:

    {% macro render_multi_field(field,field_name) %}
        <div class="form-group">
            {{ field_name }}
            {% for subfield in field %}
            <div class="base_class{% if subfield.errors %} error_class{% endif %}" id="{{subfield.name}}-group">
                {{ subfield(**kwargs)|safe }}
                <button data-field="{{ subfield.name }}-group">Remove Entry</button>
            </div>
            {% if subfield.errors %}
                 {% for error in subfield.errors %}
                    <p class="error_class">{{ error }}</p>
                {% endfor %}
            {% endif %}
    
            {% endfor %}
            <br/>
            <button type="button">Add entry</button>
        </div>
    {% endmacro %}
    

    我使用此宏将具有 0 的字段呈现到任意数量的条目。它允许错误呈现、填充默认值以及您可以使用 WTForms 执行的任何其他操作。

    在我的例子中,小部件是通过 javascript 通过宏中的按钮添加/删除的。

    【讨论】:

    • 你能分享一下javscript代码吗?我很难理解这一点。谢谢
    • 嗨@iodbh 我正在尝试做类似的事情,但由于某种原因,我动态添加的条目不会检索输入的数据,可以根据您的建议来做,我的问题就在这里,干杯! stackoverflow.com/questions/45959882/…
    猜你喜欢
    • 2018-08-10
    • 2015-07-19
    • 2013-03-16
    • 2018-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-19
    • 2014-07-17
    • 1970-01-01
    相关资源
    最近更新 更多