Python Django:在嵌套字典上迭代
这是我想反复阅读的词典:Python Django:在嵌套字典上迭代,python,html,django,dictionary,Python,Html,Django,Dictionary,这是我想反复阅读的词典: { '04/14/2018': { '12:15': { 'Club 1': { 'venue_address': 'Address 1', 'venue_webaddress': 'http://www.address1.com/line-up', 'show_data': { 7968
{
'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 %}
{%block content%}
{show_dates%}
{{date_key}}
{show_dataset.items.date_key%中的时间_key为%1}
{{time_key}}
{%endfor%}
{%endfor%}
{%endblock内容%}
我认为这段代码会产生:
2018年4月14日
12:15
3:00四点 2018年4月15日
除了它没有,我不明白为什么
{{show_dataset.items}
是字典中的迭代器,因此您不能使用date_键为它下标,希望获取dict项
此外,您不能在Django模板中仅使用变量按键查找dict项
您需要的是首先自己创建一个查找过滤器。在某个应用程序的template_tags目录中,在文件util_filters.py中创建此筛选器:
然后在模板中:
{% load util_filters %}
...
{% for time_key in show_dataset|lookup:date_key %}
请注意,如果您只需要这些键(如示例中所示),则此功能可以正常工作。如果还需要访问每个时间\u键的值,则必须编写一个不同的筛选器,返回(键、值)对以进行迭代(项()
)。谢谢。我是Django的新手。对于本例,我是否必须创建一个template_tags目录,如果是,我是否必须在任何地方注册它(settings.py、admin模块等)?此外,我还需要归还其他字典。你在回答中提到了这一点。过滤器的文档是sparce。你介意把它说清楚吗?有关更多详细信息,请参阅。但它的要点是:在应用程序的顶层创建一个templatetags
目录(例如,在views.py旁边),并通过包含一个(空的)\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuupy
文件使其成为一个模块。仅此而已,重新启动服务器后,Django将找到它。Mylookup
函数返回键的python值,如果这是一个字典,它将返回该值。如果要迭代该字典的键和值,可以创建第二个过滤器,def items(struct)
,该过滤器不带任何参数,并返回字典的iterable.items()
,因此可以执行{%for key,value in show_dataset | lookup:date|key | items%}
{% load util_filters %}
...
{% for time_key in show_dataset|lookup:date_key %}