Jinja变量未在for循环中正确设置

时间:2012-02-24 19:23:39

标签: python jinja2 cheetah

我在Jinja中有一个可变范围问题,表格不对齐。我试图将目前使用Cheetah编写的模板转换为Jinja但由于某种原因,这个逻辑块不会转换并获得输出python是一个更大的混乱。

原始猎豹代码

#set $sname = ""
#for $serv in $proc:
    #if $serv.id == $v[8]:
        <td> $serv.shortname </td>
        #set $sname = $serv.shortname
    #end if
#end for

#if $sname == "":
<td><span style="color:#ff0000">Server not found</span></td>
#end if

所以上面代码的所需输出循环通过一些对象将id与当前行对象匹配并更新值。然后检查该值是否仍然为空并且不打印任何服务器。

不能使用的Jinja代码

{% set sname = "" %}
{{ v[8] }}
{% for serv in proc %}
{% if serv.id == v[8] %}
    <td> {{ serv.shortname }} </td>
    {% set sname = serv.shortname %}
{% endif %}
{% endfor %}

{% if sname == "" %}
<td><span style="color:#ff0000">Server not found</span></td>
{% endif %} 

这个代码如果它正确地匹配它打印两列的id,因为在循环之外sname仍然设置为“”。我尝试在循环中进行比较,但它打印的内容类似于

找不到服务器| ServerName |未找到服务器

1 个答案:

答案 0 :(得分:1)

Jinja中的for循环有一个else构造,当没有数据可用时调用该构造。 if也是一个表达式,可用于过滤列表。所以这应该有效:

{% for serv in proc if serv.id == v[8] %}
    <td> {{ serv.shortname }} </td>
{% else %}
    <td><span style="color:#ff0000">Server not found</span></td>
{% endfor %}

唯一需要注意的是,如果serv中有多个proc的ID与v中的第9个条目匹配,那么您将获得多个td } s - 但是如果你只有一个,那么上面的代码就是你要找的。