我将两个对称字典传递给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>
答案 0 :(得分: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 :(得分:1)
我能够通过在每个字符串的末尾添加.rstrip(&#34; \ r \ n&#34;)来修复代码。
您可以通过将每个字符串放入len()并输出其大小来判断您是否遇到类似问题。如果它们不相等,那么就会有一个特殊的角色。