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
相关产品推荐
相关产品推荐

