You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django中如何遍历嵌套字典?附待遍历嵌套字典示例

嘿,这个嵌套字典的层级确实有点多,不过在Django里不管是在视图层处理数据,还是在模板层渲染展示,都可以用嵌套循环轻松搞定,我给你分两种常用场景讲清楚:

在Django视图中遍历处理嵌套字典

如果你需要在视图里先对这些数据做清洗、筛选或者整理,直接用Python的嵌套for循环就行,比如:

# 假设这是你要处理的嵌套字典
event_data = { 
    '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' 
            } 
        } 
    }
}

# 逐层遍历提取信息
for date, time_slots in event_data.items():
    print(f"日期: {date}")
    for time, clubs in time_slots.items():
        print(f"  时间: {time}")
        for club_name, club_details in clubs.items():
            print(f"    俱乐部: {club_name}")
            # 用get方法避免键不存在报错
            print(f"      地址: {club_details.get('venue_address', '暂无地址')}")
            
            # 处理可选的show_data字段
            if 'show_data' in club_details:
                for show_id, show_info in club_details['show_data'].items():
                    print(f"      演出ID: {show_id}")
                    print(f"        标题: {show_info['show_title']}")
                    print(f"        票价: ${show_info['price']}")
                    print(f"        阵容:")
                    for act in show_info['acts']:
                        # 取元组第一个元素作为演出名称
                        print(f"          - {act[0]}")

这种方式适合在视图里提前把数据转换成更适合模板渲染的结构,比如把嵌套字典转成列表,或者筛选出需要的字段再传给模板。

在Django模板中遍历渲染嵌套字典

如果要直接在模板里展示这些数据,先在视图把字典传到模板上下文,再用Django模板的{% for %}标签逐层遍历就行:

首先是视图代码:

# views.py
from django.shortcuts import render

def event_page(request):
    # 你的嵌套字典
    event_data = { 
        # ... 这里放你的数据 ...
    }
    # 把数据传到模板
    return render(request, 'events/event_page.html', {'event_data': event_data})

然后是模板文件events/event_page.html的代码:

{% for date, time_slots in event_data.items %}
    <div class="date-section">
        <h2>{{ date }}</h2>
        
        {% for time, clubs in time_slots.items %}
            <div class="time-slot">
                <h3>场次时间: {{ time }}</h3>
                
                {% for club_name, club_details in clubs.items %}
                    <div class="club-card">
                        <h4>{{ club_name }}</h4>
                        <p>地址: {{ club_details.venue_address|default:"暂无地址信息" }}</p>
                        
                        {% if club_details.venue_webaddress %}
                            <p>俱乐部官网: <a href="{{ club_details.venue_webaddress }}" target="_blank">点击访问</a></p>
                        {% endif %}
                        
                        <!-- 处理演出数据 -->
                        {% if club_details.show_data %}
                            {% for show_id, show_info in club_details.show_data.items %}
                                <div class="show-info">
                                    <h5>演出: {{ show_info.show_title }}</h5>
                                    <p>票价: ${{ show_info.price }}</p>
                                    {% if show_info.payment_webaddress %}
                                        <p><a href="{{ show_info.payment_webaddress }}" target="_blank">立即预约</a></p>
                                    {% endif %}
                                    
                                    <p>演出阵容:</p>
                                    <ul>
                                        {% for act in show_info.acts %}
                                            <!-- 取元组第一个元素作为演出名称 -->
                                            <li>{{ act.0 }}</li>
                                        {% endfor %}
                                    </ul>
                                </div>
                            {% endfor %}
                        {% endif %}
                    </div>
                {% endfor %}
            </div>
        {% endfor %}
    </div>
{% endfor %}

这里要注意几个细节:

  • 用|default过滤器处理可能缺失的字段(比如有的俱乐部没有地址或演出数据),避免模板报错
  • 对可选字段(比如show_data)先做存在性判断,再遍历
  • 元组的元素可以用act.0或者act|first来获取第一个值

内容的提问来源于stack exchange,提问作者SonOfSeuss

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:49:45