我有一个HTML / jinja2模板,用于以表格的形式显示数据。
表的数据可能有不同的方式,我希望模板能够使用if语句处理这两种类型。 python中的type(x)函数不适用于这种语言。
一系列词典(词典列表)
数组数组(列表列表)
模板的一部分:
{% block page_content %}
<input type="text" id="search" placeholder="Type to search">
<table id="table" class="table">
<tr style="white-space:nowrap;">
{% for h in headers %}
{% if h is string %}
<th>{{h}}</th>
{% else %}
<th>{{h[1]}}</th>
{% endif %}
{% endfor %}
</tr>
{%if data is "TYPE CHECK HERE"}
{% for row in data %}
{% if row != {} %} #ALTERNATIVELY, COULD DO A TYPE CHECK HERE
<tr style="white-space:nowrap;{% if row['bad'] %}background-color:rgba(255, 0, 0, 0.09);{% endif %}">
{% for h in headers %}
<td style="white-space:nowrap;">{{ row[h[0]] }}</td>
{% endfor %}
</tr>
{% endif %}
{% endfor %}
{%endblock%}
TL:DR jinja2中有哪些可区分的类型?如何检查变量的类型?
答案 0 :(得分:1)
在渲染jinja之前,最好在python端保留逻辑代码。
因此,将python端的数据传输到标题列表,并将嵌套列表作为数据传输:
render_template('test.html',
headers=['name', 'age',],
rows=[{'color': 'red', 'data': ['john', 84]},
{'color': 'green', 'data':['jacob', 45]}]
HTML:
<table>
<thead>
<tr>
{% for item in header %}
<th> {{ item }} </th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for row in rows %}
<tr style="colour: {{ row['color'] }}">
{% for cell in row['data'] %}
<td>{{cell}}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
在学习的过程中,我也尝试过与你类似的方法,但最后我发现这种方法效果最好,因为它为你提供了最大的数据灵活性,而在python方面操作数据通常非常简单。所以不是一个真正的答案,只是一般的建议。
答案 1 :(得分:0)
您可以查看this link,其中描述了一些要比较的有效类型。例如,您可以尝试check is a dict:
{% if type({'a':1,'b':2}) is mapping %}
print "Oh Yes!!"
{% else %}
print "Oh No!!!"
{% endif %}
您可以嵌套任何需要的东西,但正确的方法是将复杂的逻辑迁移到控制器。
PD:此示例取自here。谢谢@ sean-vieira
答案 2 :(得分:0)
my_var = []
my_var.insert(0, 'list')
my_var = '111'
{% if my_var[0] == 'list' %}
list:
{% for i in my_var[1:] %}
{{ i }}
{% endfor %}
{% else%}
str: {{ my_var }}
{% endif %}