如何在Django中遍历字典项?航班预订网站遍历异常
Django航班预订网站模板无法正常显示乘客信息的解决方案
问题根源
- 视图返回的是QuerySet而非单个对象:
Passenger.objects.filter(id=1)返回的是包含单个对象的查询集(QuerySet),不是Passenger实例,模板中直接对其调用items()会报错,因为QuerySet没有该方法。 - 模板遍历方式错误:即使拿到单个Passenger对象,也不能直接用
items()遍历,因为模型对象不是字典类型。
解决方案
步骤1:修正视图函数,获取单个乘客对象
将filter()替换为get(),并处理对象不存在的情况:
def passenger(request): try: # get()返回单个对象,若不存在会抛出DoesNotExist异常 passenger = Passenger.objects.get(id=1) except Passenger.DoesNotExist: passenger = None context = { 'passenger': passenger, 'name': 'passenger' } return render(request, 'passengers.html', context)
步骤2:修正模板,正确展示乘客信息
推荐使用明确指定字段的方式(更可控,适合业务场景):
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Passenger Information</title> </head> <body> {% if passenger %} <h1>用户信息</h1> <ul> <li>名字 -- {{ passenger.first_name }}</li> <li>姓氏 -- {{ passenger.last_name }}</li> <li>邮箱 -- {{ passenger.email }}</li> <li>行程类型 -- {{ passenger.get_trip_choice_display }}</li> <li>出发地 -- {{ passenger.flying_from }}</li> <li>目的地 -- {{ passenger.flying_to }}</li> </ul> {% else %} <h2>无用户信息</h2> {% endif %} </body> </html>
注意:get_trip_choice_display()是Django为choices字段自动生成的方法,用于获取字段对应的友好显示文本(比如返回one_way而非OW)。
如果需要动态遍历所有字段(不推荐,会包含内部属性),可以使用对象的__dict__属性并过滤下划线开头的字段:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Passenger Information</title> </head> <body> {% if passenger %} <h1>用户信息</h1> <ul> {% for key, value in passenger.__dict__.items %} {% if not key.startswith('_') %} <li>{{ key|capfirst }} -- {{ value }}</li> {% endif %} {% endfor %} <!-- 单独展示行程类型的友好文本 --> <li>Trip Choice Display -- {{ passenger.get_trip_choice_display }}</li> </ul> {% else %} <h2>无用户信息</h2> {% endif %} </body> </html>
额外说明
如果确实需要处理多个乘客的场景(比如用filter()返回多个结果),模板中应先遍历查询集,再访问每个对象的属性:
{% if passenger %} <h1>用户列表</h1> {% for p in passenger %} <ul> <li>名字 -- {{ p.first_name }}</li> <!-- 其他字段... --> </ul> {% endfor %} {% else %} <h2>无用户信息</h2> {% endif %}
内容的提问来源于stack exchange,提问作者Vivek Mogalla
相关产品推荐
相关产品推荐

