如何使用WTForms绘制没有id属性的输入?

时间:2016-07-04 21:18:39

标签: jinja2 wtforms flask-wtforms

在我的烧瓶应用程序中,我必须在同一页面上多次绘制一个表单。这导致了我在页面上有多个具有相同id的输入字段的问题。 E.g:

class ChannelForm(flask_wtf.Form):
     name = StringField('name')

与此模板一起使用:

<form>
    {{ form.name }}
</form>
...
<form>
    {{ form.name }}
</form>

导致两个输入元素具有相同的id

<input id="name" name="name" value="" type="text">

是否有官方方法可以禁用添加id属性?

3 个答案:

答案 0 :(得分:3)

快速n&#39;脏:

我发现以下情况很有效:我不是直接使用该字段,而是将它们包装在jinja宏中:

{% macro render_field(field) %}
<label>
    <span>{{ _field.label.text }} </span>
    {{ field(id=False, **kwargs) }}
</label>
{% endmacro %}

可以这样使用:

{% from "_formhelpers.html" import render_field %}
{{ render_field(form.name) }}

这里的技巧是在渲染字段时传递id=False

使用元对象:

_Auto = object()
class NoIdAttributeMeta(DefaultMeta):
    """
    Surpresses rendering the `id' attribute.
    """

    def bind_field(self, form, unbound_field, options):
        """
        Raises TypeError in case 'id' is given as a positional arg when constructing a field.
        If this happens, make this code smarter or pass `id' as a keyword arg.
        """
        # we check `id' at rendering time and if it is still _Auto, do not render it
        unbound_field.kwargs.setdefault('id', _Auto)
        return super().bind_field(form, unbound_field, options)

    def render_field(self, field, render_kw):
        if field.id is _Auto:
            field.id = False
        return super().render_field(field, render_kw)

class MyForm(flask_wtf.Form):
    Meta = NoIdAttributeMeta

或务实:

您还可以为表单的每个实例添加不同的前缀,因此您拥有唯一的ID:

my_form = MyForm(prefix="form1")
    pass

答案 1 :(得分:1)

我认为您可以将自定义ID传递给字段构造函数,如下所示:

<form>
    {{ form.name(id_='yourId') }}
</form>
...
<form>
    {{ form.name(id_='yourId2') }}
</form>

答案 2 :(得分:1)

您不需要id = False,因为您在调用render_field()时已经可以设置id

{% macro render_field(_field) %}
<label>
    <span>{{ _field.label.text }} </span>
    {{ _field(**kwargs) }}
</label>
{% endmacro %}

用法:

{{ render_field(field, id=False) }}

阐释: 因为你有**** kwargs **,你可以使id = False,这将更加dymanic。您可以选择何时删除ID。 希望对那些使用Google搜索解决方案的人提供帮助