首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何迭代django模板中的嵌套字典

如何迭代django模板中的嵌套字典
EN

Stack Overflow用户
提问于 2011-07-24 06:04:36
回答 3查看 23.1K关注 0票数 33

我不确定迭代我的嵌套字典以打印每个日期的每个水果的总值和良好值的矩阵的最有效方法。以下面的两个列表和字典为例:

代码语言:javascript
复制
fruits = ['apples','oranges','bananas']
harvest_dates = ['2011-07-23','2011-07-22','2011-07-21']

harvest_data = {
  'apples': {
    '2011-07-23': {
      'total': 100,
      'good': 80},
     '2011-07-22': {
       'total': 97,
       'good': 92},
     '2011-07-21': {
       'total': 90,
       'good': 85}
  },
  'oranges': {
    '2011-07-23': {
      'total': 86,
      'good': 82},
    '2011-07-22': {
      'total': 90, 
      'good': 75},
    '2011-07-21': {
      'total': 92,
      'good': 92}
  },
  'bananas': {
    '2011-07-23': {
      'total': 10,
      'good': 9},
    '2011-07-22': {
      'total': 12, 
      'good': 11},
    '2011-07-21': {
      'total': 9,
      'good': 9}
  }
}

我可以用python很容易地做到这一点:

代码语言:javascript
复制
for fruit in fruits:
  for day in harvest_dates:
    print "harvest: %s" % harvest_data[fruit][day]['total']
    print "good crop: %s" % harvest_data[fruit][day]['good']

但是我不知道如何在django模板中访问这些数据。我一直在尝试这样的东西:

代码语言:javascript
复制
{% for fruit in fruits %}
  ...
  {% for day in harvest_dates %}
    ...
    {{ harvest_data.fruit.day.total }}
    {{ harvest_data.fruit.day.good }}
    ...
  {% endfor %}
{% endfor %}

但它根本不起作用。

代码语言:javascript
复制
{% for fruit in fruits %}
  {{ harvest_data.fruit }}  <--- this does not exist
  {{ harvest_data[fruit] }}  <--- this does not work
{% endfor %}

我是一个完全的业余爱好者,我可能做错了这一切,但我已经用谷歌搜索了相当多,我不清楚获取我想要的数据的最好方法是什么。

EN

回答 3

Stack Overflow用户

发布于 2011-07-24 06:51:03

由于您熟悉python,下面是您在Django模板中迭代字典的逻辑方式:

代码语言:javascript
复制
for key,value in harvest_data.items():
...     print key
...     for key2,value2 in value.items():
...         print key2
...         for key3,value3 in value2.items():
...             print "%s:%s"%(key3,value3)

在您的模板中,这转换为:

代码语言:javascript
复制
{% for key, value in harvest_data.items %}
    {{ key }} <br>
    {% for key2,value2 in value.items %}
        {{ key2 }} <br>
        {% for key3, value3 in value2.items %}
            {{ key3 }}:{{ value3 }} <br>
        {% endfor %}
    {% endfor %}
{% endfor %}

在描述for模板标记的工作原理时,Django文档实际上简单地包含了一个如何遍历字典的示例:

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#for

票数 40
EN

Stack Overflow用户

发布于 2011-07-24 07:03:01

正如rolling stone所说的,这是在模板中迭代字典的方法,我只会在每次迭代中更改不同关键字的键、值关键字,如下所示:

代码语言:javascript
复制
{% for key, value in harvest_data.items %}
    {{ key }} <br>
    {% for key2,value2 in value.items %}
        {{ key2 }} <br>
        {% for key3, value3 in value2.items %}
            {{ key3 }}:{{ value3 }} <br>
        {% endfor %}
    {% endfor %}
{% endfor %}

只是为了清楚起见:)

如果你想要排列你的值,我建议你使用另一种数据结构,你可以按日期排序,例如像这样的:

代码语言:javascript
复制
{ 'oranges' : [(date1, value1), (date2,value2)] ...}

尽量在模板中执行尽可能少的操作,所以如果没有必要,就不要执行排序或嵌套if

票数 8
EN

Stack Overflow用户

发布于 2016-03-21 17:30:36

这个问题真的很老了,但我会加上我的1.5c。

这是重组标签(https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#regroup)和一些数据重构的一个很好的用例:

  1. 将您的数据作为数据点的简单列表:

harvest_data ={‘水果’:‘苹果’,‘日期’:'2011-07-23','total':100,'good':80},##...模板中的

  • ,按选择的维度分组:

{% regroup harvest_data by for data_by_fruits %} {% for data_by_fruits %} {{ data.grouper }} # 'apples‘{% regroup data.list by date as data_by_fruits_date %} {% for data_1 in data_by_fruits_date %} {{ data_1.grouper }} # '2011-07-23’{% for datapoint在data_1.list %}中,总计:{{ datapoint.total }}好:{{ datapoint.good }} {% Endfor%} {% Endfor%} {% Endfor%}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6803599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档