2012-02-24 2 views
1

У меня возникает проблема с переменной областью в Jinja, которая смещает таблицу. Я пытаюсь преобразовать текущий шаблон, который написан в Cheetah, в Jinja, но по какой-то причине этот блок логики не переводит и получает выход, что python еще более запутанный.Переменная Jinja не установлена ​​правильно для цикла

Оригинальный код гепарда

#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 

Таким образом, требуемый выход кода выше цикл через некоторые объекты соответствуют идентификаторы к текущему объекту строк и обновить значение. затем проверьте, все ли значение равно null и печать не найдена сервером.

Дзиндзя код, который не работает

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

Этот код вместо этого, если он правильно соответствует иды он печатает обе колонки, потому что вне цикла SNAME все еще установлен в положение «». Я попытался сделать сравнение внутри цикла, но напечатал что-то вроде

Сервер не найден | Имя_сервера | Сервер не найден

+0

Аналогичные вопросы, касающиеся сферы применения в шаблонах Jinja2: http://stackoverflow.com/questions/4870346/can-a-jinja-variables-scope-extend-beyond-in-an-inner-block –

ответ

1

Цикл for в 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 в proc с идентификатором, который соответствует девятому запись в v, то вы получите несколько td с - но если вы будете только когда-либо есть один, тогда приведенный выше код - это то, что вы ищете.

+0

@downvoter - разум объясняет так что ответ может быть улучшен? –

Смежные вопросы