【问题标题】:Jinja variable not being set properly in for loop在 for 循环中没有正确设置 Jinja 变量
【发布时间】:2012-03-15 06:11:44
【问题描述】:

我在 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 到当前行对象并更新值。然后检查该值是否仍然为 null 并打印 no server found 。

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 仍设置为“”。我尝试在循环内进行比较,但它打印出类似

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

【问题讨论】:

标签: python jinja2 cheetah


【解决方案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 %}

唯一需要注意的是,如果proc 中有多个serv 的ID 与v 中的第9 个条目匹配,那么您将获得多个tds - 但如果您只会曾经有过一个,那么上面的代码就是你要找的。​​p>

【讨论】:

  • @downvoter - 介意解释一下以便改进答案吗?
猜你喜欢
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
  • 2018-05-21
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
相关资源
最近更新 更多