Django跳转详情页时报'Photo' object is not iterable错误如何解决
错误原因
你在views.py的view视图中,使用Photo.objects.get(id=pk)查询返回的是单个Photo模型对象,但在详情页模板view.html中使用了{% for Photo in alldescription %}语法对这个单个对象做循环遍历,Django模板尝试遍历非可迭代的单个对象时就会抛出'Photo' object is not iterable报错。
解决方法
方案1:修改详情页模板view.html(推荐,符合单条详情页的业务逻辑)
直接删除循环语法,直接调用单个对象的属性即可,修改后的模板代码如下:
{% extends "logisticbase.html" %} {% block content %} <style> </style> <div style="padding-left:16px"> <br> <h4>Reception Unserviceable </h4> <div class="form-block"> </tr> <img src="/media/{{alldescription.image}}" width="250px"> <!-- 其他字段也可以直接用alldescription.xxx调用,比如客户名称{{alldescription.customername}} --> </div> </div> {% endblock %}
方案2:修改views.py的view视图(如果需要返回多个Photo对象的场景可选择)
如果你的业务逻辑需要返回多条Photo数据,把get改为filter查询即可,返回的是可迭代的查询集:
def view(request, pk): alldescription = Photo.objects.filter(id=pk) # filter返回查询集,可遍历 return render(request, 'view.html', {'alldescription': alldescription})
额外优化建议
- 你在
urls.py中定义的view路由参数pk类型是str,但实际传入的是整数id,建议改为int避免无效参数请求:path('view/<int:pk>/', views.view, name='view') - 单条查询建议使用
get_object_or_404替代原生get,当传入的id不存在时会直接返回404页面,而非抛出500服务错误:from django.shortcuts import get_object_or_404 def view(request, pk): alldescription = get_object_or_404(Photo, id=pk) return render(request, 'view.html', {'alldescription': alldescription})
内容的提问来源于stack exchange,提问作者Rainysky
相关产品推荐
相关产品推荐

