2014-06-20 4 views
0

Я передаю два симметричных словаря шаблону jinja2 для рендеринга. Эти два словаря установлены и требуются. Я хочу сравнить значения в установленном и требуемом для того, чтобы они были той же самой версией. Номера версий хранятся в виде строк. Если версии не равны, я хочу выделить эту строку в моей таблице.Сравнение симметричных словарей в шаблоне Jinja2

Значения печатаются правильно, но сравнение всегда терпит неудачу.

<table border="1"> 
    <tr> 
    <td>Package</td> 
    <td>Version Required</td> 
    <td>Version Installed</td> 
    </tr> 

{% for key, value in required.items() %} 
{% if installed[key] == required[key] %} 
    <tr> 
    <td>{{key}}</td> 
    <td>{{value}}</td> 
    <td>{{installed[key]}}</td> 
    </tr> 
{% else %} 
    <tr bgcolor="#ff0000"> 
    <td>{{key}}</td> 
    <td>{{value}}</td> 
    <td>{{installed[key]}}</td> 
    </tr> 
{% endif %} 
{% endfor %} 
</table> 

ответ

3

Лучше держать логику из шаблона jinja2 как можно больше и создать хорошо используемые данные в коде Python:

render.py

Вместо двух словарей, мы можем передать список с кортежами (package_name, req_ver, installed_ver)

from jinja2 import Template 

with open("table.jinja2") as f: 
    templ = Template(f.read()) 
required = {"boto": "1.1.1", "plac": "2.2.3", "pyyaml": "3.3.3", "jinja2": "4.4.4"} 
installed = {"boto": "1.1.1", "plac": "2.2.2", "pyyaml": "3.3.3", "jinja2": "4.4.4"} 

packages = [(key, installed[key], required[key]) for key in sorted(installed)] 

print templ.render(packages=packages) 

table.jinja2

В шаблоне мы можем изменить только bgcolor либо с помощью жесткого кода цветового кода, либо даже лучше, изменив стиль (не показан здесь).

Я также использовал управление пробелами - внутри структур управления.

<table border="1"> 
    <tr><td>Package</td> <td>Version Required</td><td>Version Installed</td></tr> 
{%- for name, ver_required, ver_installed in packages %} 
    <tr{% if ver_required != ver_installed %} bgcolor="#ff0000" {% endif %}> 
     <td>{{name}}</td> <td>{{ver_required}}</td> <td>{{ver_installed}}</td> 
    </tr> 
{%- endfor %} 
</table> 

Выполнить это:

$ python render.py >tabl.html 

и просмотреть таблицу в веб-браузере.

<table border="1"> 
    <tr><td>Package</td> <td>Version Required</td><td>Version Installed</td></tr> 
    <tr> 
     <td>boto</td> <td>1.1.1</td> <td>1.1.1</td> 
    </tr> 
    <tr> 
     <td>jinja2</td> <td>4.4.4</td> <td>4.4.4</td> 
    </tr> 
    <tr bgcolor="#ff0000" > 
     <td>plac</td> <td>2.2.2</td> <td>2.2.3</td> 
    </tr> 
    <tr> 
     <td>pyyaml</td> <td>3.3.3</td> <td>3.3.3</td> 
    </tr> 
</table> 
1

Ответ Яна отличный, но я также нашел конкретный вопрос, который у меня был. Проблема заключалась в том, что одна из строк имела специальный символ на конце, а другой - нет.

Я смог исправить код, добавив .rstrip ("\ r \ n") в конец каждой строки.

Вы можете узнать, есть ли у вас аналогичная проблема, поместив каждую строку в len() и выведя их размеры. Если они не равны, то есть специальный символ.

+1

Молодцы. Эта небольшая деталь, которая вызвала вашу проблему, намного проще разрешить в чистом Python (в идеале написании небольшого набора тестов или добавлении некоторого 'assert' в код), то в любом виде шаблона. Вот почему практическое сохранение большей части логики в Python и сохранение шаблонов только для рендеринга. –

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