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

