区分jinja2中的类型

时间:2018-04-17 20:51:23

标签: python html python-3.x flask jinja2

我有一个HTML / jinja2模板,用于以表格的形式显示数据。

表的数据可能有不同的方式,我希望模板能够使用if语句处理这两种类型。 python中的type(x)函数不适用于这种语言。

  1. 一系列词典(词典列表)

  2. 数组数组(列表列表)

  3. 模板的一部分:

    {% 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中有哪些可区分的类型?如何检查变量的类型?

3 个答案:

答案 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)

  1. my_var是列表
my_var = []
my_var.insert(0, 'list')
  1. my_var是str
my_var = '111'
  1. 以区分jinja2
{% if my_var[0] == 'list' %}
list: 
{% for i in my_var[1:] %}
{{ i }}
{% endfor %}

{% else%}
str: {{ my_var }}
{% endif %}