Как перебирать вложенные словари в шаблонах Django - PullRequest
25 голосов
/ 24 июля 2011

Я не уверен, что наиболее эффективный способ перебрать мои вложенные словари, чтобы напечатать матрицу общих и хороших значений для каждого фрукта для каждой даты.Возьмем, к примеру, два списка и словарь ниже:

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

Я - полный любитель, и я, вероятно, делаю все это неправильно, ноЯ немного поработал с Google, и мне не ясно, каков наилучший подход к получению нужных мне данных.

Ответы [ 3 ]

34 голосов
/ 24 июля 2011

Так как вы знакомы с 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 %}

Документы Django на самом деле кратко включают пример того, как перебирать словари при описании работы тега шаблона for:

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

7 голосов
/ 24 июля 2011

, как говорит Роллинг Стоун, это способ перебирать словари в шаблонах, я бы только менял ключ, значение ключевых слов для разных ключевых слов в каждой итерации, как это:

{% 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, если вам не нужно

1 голос
/ 21 марта 2016

Действительно старый вопрос, но я добавлю свой 1.5c.

Это хороший пример использования тега regroup (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 %}
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...