Django点击Genre分类跳转出现'Genre' object is not iterable错误如何解决
错误原因&修复步骤
1. 核心报错原因:单个对象不可迭代
你在genreView中通过get_object_or_404(Genre, id=pk)查询到的是单个Genre分类对象,不是可迭代的查询集,但你的genre.html模板里必然写了{% for xxx in genres %}的循环代码,对单个对象执行遍历就会抛出'Genre' object is not iterable错误。
修复逻辑:
分类列表页需要返回该分类下的所有电影数据,假设你的电影模型名为Movie,且通过外键关联了Genre,修改视图代码:
def genreView(request, pk): # 先拿到当前点击的分类对象 genre = get_object_or_404(Genre, id=pk) # 拿到该分类下的所有电影(外键关联字段请替换成你自己的实际字段名) movies = Movie.objects.filter(genre=genre) context = { 'current_genre': genre, 'movies': movies } return render(request, 'genre.html', context)
后续genre.html模板里遍历movies变量渲染电影列表即可,不要遍历单个分类对象。
2. urls.py 多处错误修复
原代码有3处错误:
- 变量名拼写错误:
urlapatterns改为urlpatterns - path参数语法错误:
path('genre/<int:pk>,缺少闭合引号,改为path('genre/<int:pk>', - 路由name重复且不匹配:两个路由都用了
name='home',第二个路由的name要和模板里反向解析的名称一致,改为name='genre'
修复后的urls.py代码:
urlpatterns = [ path('', views.home, name='home'), path('genre/<int:pk>', views.genreView, name='genre') ]
3. 其他潜在错误修复
models.py里的__str__方法缩进错误,应该放在Genre类内部:
class Genre(models.Model): title = models.CharField(max_length=500) def __str__(self): return self.title
内容的提问来源于stack exchange,提问作者Amit Buyo
相关产品推荐
相关产品推荐

