在我的烧瓶应用程序中,我必须在同一页面上多次绘制一个表单。这导致了我在页面上有多个具有相同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
属性?
答案 0 :(得分:3)
我发现以下情况很有效:我不是直接使用该字段,而是将它们包装在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搜索解决方案的人提供帮助