2016-07-04 32 views
1

在我的烧瓶应用程序中,我必须在同一页上多次绘制表单。这导致了我在页面上有多个具有相同ID的输入字段的问题。例如: -如何使用WTForms绘制没有id属性的输入?

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属性的官员呢?

回答

2

快速N”脏:

我发现了以下工作很好:而不是使用领域直接,我将它们包装在一个神社宏:

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

我想你可以通过自定义ID到外地的构造是这样的:

<form> 
    {{ form.name(id_='yourId') }} 
</form> 
... 
<form> 
    {{ form.name(id_='yourId2') }} 
</form> 
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 =假,这将是更dymanic。您可以选择何时删除身份证。 希望帮助那些使用Google解决方案的人

相关问题