【问题标题】:How to iterate over nested dictionaries in django templates如何遍历 django 模板中的嵌套字典
【发布时间】:2011-10-11 19:52:43
【问题描述】:

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

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 中轻松做到这一点:

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 模板中访问这些数据。我一直在尝试诸如:

{% for fruit in fruits %}
  ...
  {% for day in harvest_dates %}
    ...
    {{ harvest_data.fruit.day.total }}
    {{ harvest_data.fruit.day.good }}
    ...
  {% endfor %}
{% endfor %}

但它根本不起作用。

{% for fruit in fruits %}
  {{ harvest_data.fruit }}  <--- this does not exist
  {{ harvest_data[fruit] }}  <--- this does not work
{% endfor %}

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

【问题讨论】:

    标签: django django-templates


    【解决方案1】:

    由于您熟悉 python,因此从逻辑上讲,您希望在 Django 模板中遍历字典:

    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)
    

    在您的模板中,翻译如下:

    {% 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

    【讨论】:

    • 我不确定这是否有意义,但我想我发现的问题是我需要根据我所在的位置从嵌套字典之一中获取特定值循环通过水果和日期。如果我只是像你提到的那样循环遍历收获数据,是否可以保证我所有的日期都会排队?
    • 我认为循环遍历字典比尝试从模板中的单独字典中获取特定值更好。 python 中的标准字典没有顺序,但如果您想保留顺序,可以使用排序字典(有关如何执行此操作的更多信息,请参阅此 SO 答案:stackoverflow.com/questions/5792190/…)。
    • 根据@Hassek 下面的评论更新了我的答案,为每次迭代包含不同的关键字。
    【解决方案2】:

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

    {% 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 %}
    

    只是为了清楚起见:)

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

    { 'oranges' : [(date1, value1), (date2,value2)] ...}
    

    尽量在你的模板中做尽可能少的操作,所以如果你不需要,不要做排序或嵌套 if

    【讨论】:

    • 感谢@Hassek,更新了我的答案以包含不同的键、值关键字。顺便说一句,您的更新中有一个小错字,{{ key3 }}:{{ value }} 应该是 {{ key3 }}:{{ value3 }}
    【解决方案3】:

    确实是老问题,但我会添加我的 1.5c。

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

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

      harvest_data = [
          {'fruits': 'apples', 'date': '2011-07-23', 'total': 100, 'good': 80},
          # ...
      ]
      
    2. 在您的模板中,按所选维度分组:

      {% regroup harvest_data by fruits as data_by_fruits %}
      {% for data in data_by_fruits %}
          <h1>{{ data.grouper }}</h1>   # 'apples'
          {% regroup data.list by date as data_by_fruits_date %}
          {% for data_1 in data_by_fruits_date %}
              <h2>{{ data_1.grouper }}</h2>    # '2011-07-23'
              {% for datapoint in data_1.list %}
                  total: {{ datapoint.total }} <br/>
                  good: {{ datapoint.good }} <br/>
              {% endfor %}
          {% endfor %}
      {% endfor %}
      

    【讨论】:

      猜你喜欢
      • 2021-12-20
      • 2020-08-03
      • 2013-09-19
      • 2019-07-14
      • 2021-01-18
      • 2018-05-24
      • 2011-12-22
      • 2022-08-17
      • 1970-01-01
      相关资源
      最近更新 更多