【问题标题】:Ordering dictionary values on Jinja2 template在 Jinja2 模板上排序字典值
【发布时间】:2016-09-22 20:35:07
【问题描述】:

我正在使用 Jinja2 模板将信息呈现给报告。我正在创建一个表格,显示系统上发生的某些类型事件的最大值、总计、avg_size 和 avg_rate。

我的代码在每 6 个条目后创建一个新行,并打印看起来正确的数据,但仔细检查后,它并没有以正确的顺序打印数据,因为我使用的是“if”语句。

有没有我可以让key2=='max_count' 总是第一个打印它的值,然后是key2 == 'total' 等等。

我想要的顺序:

max_count, total, avg_size, avg_rate

这是导致问题的代码部分:

{% for key2, value2 in max_min_data[key].iteritems() %}  
  {% if count == 6 %}
    </tr>
    <tr>
    {% set count = 0 %}
  {% endif %} 
  {% if key2 == 'max_count'%}
    <td style="text-align: center; width:3.1in;">{{ '{0:,}'.format(value2['max']) }}</td>
  {% endif %}
  {% if key2 == 'total'%}
    <td style="text-align: center; width:3.1in;">{{'{0:,}'.format(value2['max'])}}</td>
  {% endif %}
  {% if key2 == 'avg_size'%}
    <td style="text-align: center; width:3.1in;">{{'{0:,}'.format(value2['max'])}}</td>
  {% endif %}
  {% if key2 == 'avg_rate'%}
    <td style="text-align: center; width:3.1in;">{{'{0:,}'.format(value2['max'])}}</td>
  {% endif %}
  {% set count = count + 1 %}
{% endfor %}

我正在循环的字典示例:

{
    'Event1': {
        'avg_rate': {'max': 11004, 'min': 0},
        'avg_size': {'max': 219, 'min': 218},
        'total': {'max': 107743, 'min': 103354},
        'max_count': {'max': 103756, 'min': 103094}
    },
    'Event2': {
        'avg_rate': {'max': 558, 'min': 0},
        'avg_size': {'max': 321, 'min': 319},
        'total': {'max': 11029, 'min': 10046},
        'max_count': {'max': 17724, 'min': 17585}
    },
    'Event3': {
        'avg_rate': {'max': 1824, 'min': 0},
        'avg_size': {'max': 363, 'min': 360},
        'total': {'max': 48737, 'min': 46529},
        'max_count': {'max': 47094, 'min': 46711}
    }
}

【问题讨论】:

  • 你也可以发布你循环的数据吗?
  • @NilsWerner 我已经发布了我正在循环浏览的字典示例
  • 下次也请格式化字典,以便人们可以阅读它(为你做的)。您似乎正在使用两个循环来遍历字典,您可以发布更多上下文和所需的输出吗?
  • @NilsWerner 当我在我的 Jinja 模板中使用 'if' 语句时,它出现在我的报告中的顺序是 'avg_rate','avg_size','total','max_count' 因为那是命令它在字典中。我的问题是如何使 Jinja 模板中的顺序不依赖于字典中的顺序,而只考虑我在上面的问题中陈述的顺序。
  • 目前的代码会创建像avg_rate | avg_size | total | max_count | avg_rate | avg_size --- total | max_count | avg_rate | avg_size ... 这样的行,混合来自两个事件的列。这真的是你想要的吗?

标签: python html templates dictionary jinja2


【解决方案1】:

结果证明这是一个比我想象的简单得多的解决方案。我将我的 Jinja2 模板更改为以下内容,这为我解决了这个问题:

{% for key2, value2 in max_min_data[key].iteritems() %}  

  <td style="text-align: center; width:3.1in;">{{ '{0:,}'.format(value['max_count']['max']) }}</td>
  <td style="text-align: center; width:3.1in;">{{'{0:,}'.format(value['total']['max'])}}</td>
  <td style="text-align: center; width:3.1in;">{{'{0:,}'.format(value['avg_size']['max'])}}</td>
  <td style="text-align: center; width:3.1in;">{{'{0:,}'.format(value['avg_rate']['max'])}}</td>

{% endfor %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 2019-09-29
    • 2016-07-18
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多