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

Django模板获取Container模型属性仅能取到self.name值问题求助

问题原因及解决方案

你代码存在两个核心错误,分别在视图层和模板层:

1. 视图层错误

  • 你通过Container.objects.all()拿到的是所有Container对象的查询集(包含多个容器实例的集合),且错误地将这个集合用number作为变量名传入模板,语义混乱且没有做数据过滤(如果要取当前码头对应的容器,应该按当前查询到的terminal实例过滤)
  • 模板无法直接读取视图未传入的变量,你直接在模板写{{ weight }}这类独立字段名,模板找不到对应变量会直接返回空值。

2. 模板层错误

  • 你没有遍历容器查询集,也没有通过容器实例读取属性,直接写字段名、大写的模型类名Container取属性都是无效的,属性必须绑定在具体的实例对象上才能读取。

修正后views.py

def terminal(request,id):
    terminal = Terminal.objects.get(name=id)
    # 过滤出当前码头关联的所有容器,变量名改为语义明确的containers
    containers = Container.objects.filter(terminal=terminal)
    return render(request, 'main/terminal.html', {'title': 'Terminal', 'terminal': terminal, 'containers': containers  })

修正后模板代码

如果要展示所有关联容器的属性,需要先遍历查询集:

{% for container in containers %}
<!-- 每个容器实例通过container.字段名取值 -->
<p>重量: {{ container.weight }}</p>
<p>所属码头: {{ container.terminal.name }}</p> <!-- 外键字段需要取具体属性时加.属性名,直接写container.terminal会调用Terminal模型的__str__方法 -->
<p>到港时间: {{ container.arive_time_to_terminal }}</p>
<p>所属港口: {{ container.port.name }}</p>
<p>CY时间: {{ container.CY }}</p>
<p>ETD时间: {{ container.ETD }}</p>
{% empty %}
<p>当前码头没有关联的集装箱数据</p>
{% endfor %}

如果只需要取单个容器,可以在视图层用Container.objects.filter(terminal=terminal).first()拿到单个实例,模板就不需要遍历,直接用{{ container.weight }}这类写法即可。


注意事项

  • Django模板默认对不存在的变量返回空字符串,不会抛出错误,调试时可以开启DEBUG模式快速定位变量不存在的问题
  • 外键字段直接取值会返回关联模型的实例,默认调用该模型的__str__方法展示内容,需要取关联模型的具体字段要额外加.+字段名
  • 查询集是多个对象的集合,必须遍历或者取单个实例后才能读取字段属性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:36:00