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

如何在Django中遍历字典项?航班预订网站遍历异常

Django航班预订网站模板无法正常显示乘客信息的解决方案

问题根源

  1. 视图返回的是QuerySet而非单个对象:Passenger.objects.filter(id=1)返回的是包含单个对象的查询集(QuerySet),不是Passenger实例,模板中直接对其调用items()会报错,因为QuerySet没有该方法。
  2. 模板遍历方式错误:即使拿到单个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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 21:32:32