这是我想要迭代的词典:
{
'04/14/2018': {
'12:15': {
'Club 1': {
'venue_address': 'Address 1',
'venue_webaddress': 'http://www.address1.com/line-up',
'show_data': {
7968: {
'price': '20',
'payment_webaddress': 'http://www.club1.com/reservation/',
'show_title': 'Street 1',
'acts': [('Act 1', None, None), ('Act 2', None, None), ('Act 3', None, None), ('Act 4', None, None), ('Act 5', None, None), ('Act 6', None, None)]
}
}
}
},
'03:00': {
'Club 2': {
'venue_address': 'Address 2',
'venue_webaddress': 'https://www.club2.com/',
'show_data': {
7879: {
'price': 'None',
'payment_webaddress': 'https://www.club2.com/checkout',
'show_title': 'Show Title 2',
'acts': [(None, None, None)]
}
}
}
},
'04:00': {
'Club 3': {
'venue_address': 'Address 3',
'venue_webaddress': 'http://www.club3.com/',
'show_data': {
7703: {
'price': '17',
'payment_webaddress': 'https://www.webaddress.com',
'show_title': 'Show Title Club 3',
'acts': [(None, None, None)]
}
}
}
},
'05:00': {
'Club 4': {
'venue_address': 'Address 4',
'venue_webaddress': 'https://club4.com/',
'show_data': {
7834: {
'price': 'None',
'payment_webaddress': 'https://club4.com/checkout',
'show_title': 'Show Title 4',
'acts': [(None, None, None)]
}
}
}
},
'05:45': {
'Club 5': {
'venue_address': 'Address 5',
'venue_webaddress': 'http://www.club5.com/',
'show_data': {
7569: {
'price': '25',
'payment_webaddress': 'https://www.clubaddress5.com',
'show_title': 'Club Address 5',
'acts': [('Act 1', None, None)]
}
}
}
},
'06:00': {
'Club 6': {
'venue_address': 'Club Address 6',
'venue_webaddress': 'https://www.club6.com/',
'show_data': {
7881: {
'price': 'None',
'payment_webaddress': 'https://www.club6.com',
'show_title': 'Show Title 6',
'acts': [(None, None, None)]
},
7880: {
'price': 'None',
'payment_webaddress': 'https://www.club6.com/checkout',
'show_title': 'Show Title 7',
'comedians': [(None, None, None)]
}
}
},
'Club 8': {
'venue_address': 'Club Address 8',
'venue_webaddress': 'http://club8.com/',
'show_data': {
7809: {
'price': 'None',
'payment_webaddress': 'https://club8.com',
'show_title': 'ACT TITLE 8',
'acts': [(None, None, None)]
}
}
},
我在Django视图中使用的代码如下:
dataset_2_ = sorted(dataset_)
context = {'show_dates': dataset_2_, 'show_dataset': dataset_, 'title': title}
return render(request, "pages/pages.html", context)
我传递两个数据集的原因是因为当我按照日期对第一个进行排序时,它会丢失所有嵌套数据。
这是我的显示代码:
{% block content %}
{% for date_key in show_dates %}
<div class='row'>
<div class='col-sm-1'></div>
<div class='col-sm-3'>
<h2>{{ date_key }} </h2>
</div>
<div class='col-sm-8'></div>
</div>
{% for time_key in show_dataset.items.date_key %}
<div class='row'>
<div class='col-sm-2'></div>
<div class='col-sm-2'>
<h3>{{ time_key }} </h3>
</div>
<div class='col-sm-8'></div>
</div>
{% endfor %}
{% endfor %}
{% endblock content %}
我认为这段代码会产生:
2018年4月14日
12:15 3:00
4:002018年4月15日 ...
除了它没有,我不明白为什么。
答案 0 :(得分:1)
{{ show_dataset.items }}
是你字典中的迭代器,所以你不能用期望获取dict项的date_key
下标它。
此外,您不能只使用变量在Django模板中按键查找dict项目。
您需要的是首先自己创建一个查找过滤器。在其中一个应用的 template_tags 目录中,在文件 util_filters.py 中创建此过滤器:
@register.filter(name='lookup')
def lookup(struct, key):
"""Return element of a list or dict using a variable."""
if isinstance(struct, (list, QuerySet)) and isinstance(key, int) and len(struct) > key:
return struct[key]
elif isinstance(struct, dict):
return struct.get(key, '')
else:
return ''
然后在你的模板中:
{% load util_filters %}
...
{% for time_key in show_dataset|lookup:date_key %}
请注意,如果您只需要密钥(如示例所示),则此方法有效。如果您还需要访问每个time_key
的值,则必须编写一个不同的过滤器,返回(键,值)对以迭代(items()
)。