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

Python 未在for循环中正确设置Jinja变量,python,jinja2,cheetah,Python,Jinja2,Cheetah,我在Jinja中遇到了一个可变范围问题,即未对齐表。我试图将当前用Cheetah编写的模板转换为Jinja,但由于某些原因,这段逻辑无法转换,因此python的输出更加混乱 原始猎豹代码 #设置$sname=“” #对于$proc中的$serv: #如果$serv.id==$v[8]: $serv.shortname #设置$sname=$serv.shortname #如果结束 #结束 #如果$sname==“”: 找不到服务器 #如果结束 因此,上面代码的期望输出是通过一些对象循环,将ID

我在Jinja中遇到了一个可变范围问题,即未对齐表。我试图将当前用Cheetah编写的模板转换为Jinja,但由于某些原因,这段逻辑无法转换,因此python的输出更加混乱

原始猎豹代码
#设置$sname=“”
#对于$proc中的$serv:
#如果$serv.id==$v[8]:
$serv.shortname
#设置$sname=$serv.shortname
#如果结束
#结束
#如果$sname==“”:
找不到服务器
#如果结束
因此,上面代码的期望输出是通过一些对象循环,将ID与当前行对象匹配,并更新值。然后检查该值是否仍然为null,并改为打印“未找到服务器”

不起作用的Jinja代码
{%set sname=”“%}
{{v[8]}
{进程%中服务的%s}
{%if serv.id==v[8]}
{{serv.shortname}}
{%set sname=serv.shortname%}
{%endif%}
{%endfor%}
{%如果sname==“”%}
找不到服务器
{%endif%}
此代码如果与ID正确匹配,则会打印两列,因为在循环之外,sname仍然设置为“”。我试着在循环内部进行比较,但它打印了类似的内容

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

Jinja中的循环有一个
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.id==v[8]}
{{serv.shortname}}
{%else%}
找不到服务器
{%endfor%}
唯一需要注意的是,如果在
proc
中有多个
serv
的ID与
v
中的第9个条目相匹配,那么您将得到多个
td
s,但是如果您只有一个,那么上面的代码就是您要寻找的。

Jinja中的循环有一个
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.id==v[8]}
{{serv.shortname}}
{%else%}
找不到服务器
{%endfor%}

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

金贾2模板中的类似问题解决范围:Jinja2模板中类似的问题解决范围:@downvoter-mind解释以便改进答案?@downvoter-mind解释以便改进答案?
{% 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 %}