Как перебирать вложенные словари в шаблоны django
Я не уверен, что самый эффективный способ перебрать мои вложенные словари, чтобы напечатать матрицу из общих и хороших значений для каждого фрукта за каждую дату. Возьмем, к примеру, два списка и словарь ниже:
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, и мне непонятно, какой лучший подход к получению данных я хочу.
Ответы
Ответ 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 %}
Документы Django на самом деле кратко включают пример того, как итерации через словари описывать, как работает тег for
:
https://docs.djangoproject.com/en/dev/ref/templates/builtins/#for
Ответ 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)] ...}
Попробуйте выполнить минимально возможные операции в ваших шаблонах, поэтому не делайте сортировку или вложенные, если вам не нужно
Ответ 3
Действительно старый вопрос, но я добавлю свой 1.5c.
Это хороший вариант использования тега перегруппировки (https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#regroup) и немного рефакторинга данных:
-
Сделайте свои данные как простой список точек данных:
harvest_data = [
{'fruits': 'apples', 'date': '2011-07-23', 'total': 100, 'good': 80},
# ...
]
-
В вашем шаблоне группа по выбранным размерам (-ам):
{% regroup harvest_data by fruits as data_by_fruits %}
{% for data in data_by_fruits %}
<h1>{{ data.grouping }}</h1> # 'apples'
{% regroup data.list by date as data_by_fruits_date %}
{% for data_1 in data_by_fruits_date %}
<h2>{{ data_1.grouping }}</h2> # '2011-07-23'
{% for datapoint in data_1.list %}
total: {{ datapoint.total }} <br/>
good: {{ datapoint.good }} <br/>
{% endfor %}
{% endfor %}
{% endfor %}