Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:在嵌套字典上迭代_Python_Html_Django_Dictionary - Fatal编程技术网

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将找到它。My
lookup
函数返回
键的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 %}