又快又脏:
我发现以下方法效果很好:我没有直接使用该字段,而是将它们包装在一个 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