Django:迭代嵌套字典

时间:2018-04-14 14:40:46

标签: 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: {
                        '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:00

     

2018年4月15日   ...

除了它没有,我不明白为什么。

1 个答案:

答案 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())。