2013-05-22 135 views
7

没有发现它有类似的问题,另一篇文章,我想产生一些复选框与烧瓶和wtforms,此刻我有这段代码:Jinja2的模板 - for循环

<div class="control-group"> 
    <p><strong>Check the enabled BRI Ports</strong></p> 
    <label class="checkbox inline"> 
     {{ form.bri1(value=1) }} {{ form.bri1.label }} 
    </label> 
    <label class="checkbox inline"> 
     {{ form.bri2(value=1) }} {{ form.bri2.label }} 
    </label> 
    <label class="checkbox inline"> 
     {{ form.bri3(value=1) }} {{ form.bri3.label }} 
    </label> 
    <label class="checkbox inline"> 
     {{ form.bri4(value=1) }} {{ form.bri4.label }} 
    </label> 
</div> 

到目前为止是这种情况,但现在我尝试像一个简单的for循环来做到这一点:

<div class="control-group"> 
    <p><strong>Check the enabled BRI Ports</strong></p> 
    {% for n in range(1,6) %} 
    <label class="checkbox inline"> 
     {{ form.brin.label }} 
    {% endfor %} 
</div> 

我(试过),{}和{{}} ...这甚至可能吗?

+0

这不是关于Flask的问题,因为Flask不包含模板引擎。想必你问Jinja2? –

+0

对不起,我是你的错。 – Kilrathy

+0

@Kilrathy所以问题是与“范围”? [this](http://stackoverflow.com/q/6036082/1205368)有帮助吗? – Salem

回答

12

尝试:

<div class="control-group"> 
    <p><strong>Check the enabled BRI Ports</strong></p> 
    {% for name, field in form._fields.items() %} 
     {% if name != 'csrf_token' %} 
      <label class="checkbox inline"> 
       {{ field(value=1) }} {{ field.label }} 
      </label> 
     {% endif %} 
    {% endfor %} 
</div> 

在那里,你可以集排序,而不是form._fields.items()或条件,而不是{% if name != 'csrf_token' %}。或者:

<div class="control-group"> 
    <p><strong>Check the enabled BRI Ports</strong></p> 
    {% for n in range(1,6) %} 
     {% if form['bri' + n|string] %} 
      <label class="checkbox inline"> 
       {{ form['bri' + n|string](value=1) }} {{ form['bri' + n|string].label }} 
      </label> 
     {% endif %} 
    {% endfor %} 
</div> 

在那里,您还可以使用n.__str__()代替过滤n|string

+0

我试了两个,第二个给我的错误“TypeError:无法连接'str'和'int'对象”。第一个部分工作,但它给了我所有的领域,我只想要BooleanField bri1-4 ...任何想法? – Kilrathy

+1

对不起,我更新了第二个例子。首先,你可以添加自己的条件:'{%if name.startswith('bri')%}'。 – tbicr

+0

嘿,非常感谢!这对我来说是完美的! – Kilrathy