Django详情页无法渲染数据,报TypeError:无法解包非可迭代int对象
问题分析
- TypeError 触发原因:核心是
detail视图未根据URL传入的pk获取对应单篇文章,且模板使用的变量名与视图传递的不匹配;另外需确认urls.py中路径参数写法是否为正确的尖括号(而非HTML转义字符</>)。 - 空白模板原因:详情页模板调用
{{post.title}}等单个文章变量,但视图传递的是所有文章的查询集posts,模板找不到对应变量导致空白。
修复步骤
1. 修正 views.py 的 detail 函数
根据pk获取单篇文章,传递与模板匹配的变量名:
# 若未导入,需添加:from django.shortcuts import get_object_or_404 def detail(request, pk): # 获取对应pk的文章,用get_object_or_404可在pk不存在时返回404页面 post = get_object_or_404(post, pk=pk) context = {'post': post} return render(request, 'detail_page.html', context)
建议模型类名改为
Post(符合Python命名规范),修改后需同步将查询语句改为Post.objects.get(...),并执行数据库迁移。
2. 修正 urls.py 的路径写法
确保路径参数使用正确的尖括号,建议末尾加斜杠符合Django规范:
path('', views.Post, name='Post'), path('detail/<int:pk>/', views.detail, name='detail'),
3. 额外优化(可选)
- 模型类名规范修改:
class Post(models.Model): title = models.CharField(max_length=200, null=True) author = models.CharField(max_length=200, null=True) body = models.TextField(max_length=200, null=True) date_created = models.DateTimeField(auto_now_add=True, null=True)
修改后执行迁移命令:
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者shery
相关产品推荐
相关产品推荐

