首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django:迭代嵌套字典

Django:迭代嵌套字典
EN

Stack Overflow用户
提问于 2018-04-14 14:40:45
回答 1查看 159关注 0票数 0

这是我想重复的字典:

代码语言:javascript
复制
{
    '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视图中使用的代码如下:

代码语言:javascript
复制
dataset_2_ = sorted(dataset_)

context = {'show_dates': dataset_2_, 'show_dataset': dataset_, 'title': title}

return render(request, "pages/pages.html", context)

我传递两个数据集的原因是,当我对第一个数据集进行排序以便按日期迭代时,它会丢失所有嵌套数据。

这是我的显示代码:

代码语言:javascript
复制
{% 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日

只是它没有而且我也不明白为什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-14 15:34:19

{{ show_dataset.items }}是字典中的迭代器,所以您不能用date_key订阅它来获取dict项。

此外,您不能只使用变量来查找Django模板中的dict项。

您需要的是首先创建一个查找过滤器自己。在您的应用程序中的template_tags目录中,在文件util_filters.py中创建此筛选器

代码语言:javascript
复制
@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 ''

然后在模板中:

代码语言:javascript
复制
{% load util_filters %}
...
{% for time_key in show_dataset|lookup:date_key %}

注意,如果您只需要这些键(如您的示例所示),这是可行的。如果您还需要访问每个time_key的值,则必须编写一个不同的过滤器,返回(键,值)对来迭代(items())。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49832618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档