创建Django博客应用时遇Blog1对象可迭代错误求助
Django博客"Blog1对象是可迭代的"错误解决思路
1. 先把视图查询改得更靠谱
你视图里用filter(post_id=id)[0]有俩问题:一是没匹配到文章时直接崩,二是写法不够规范。换成Django专门获取单个对象的方法更稳妥:
# 直接获取,找不到会抛异常 def blogpost(request, id): post = Blog1.objects.get(post_id=id) return render(request, 'blogpost.html', {'post':post})
要是想找不到时返回404页面(更友好),就用get_object_or_404:
from django.shortcuts import get_object_or_404 def blogpost(request, id): post = get_object_or_404(Blog1, post_id=id) return render(request, 'blogpost.html', {'post':post})
2. 模板代码是核心问题(十有八九错在这)
提示"Blog1对象是可迭代的",基本就是你在blogpost.html里把单个post对象当成列表循环了。比如你可能写了:
{% for article in post %} <h1>{{ article.title }}</h1> {% endfor %}
但post是单个文章实例,不是集合,直接访问属性就行:
<h1>{{ post.title }}</h1> <p>{{ post.content }}</p>
把多余的for循环删掉,这个错误就没了。
3. 补个URL的小bug
你urls.py里的name="blogpost"引号没闭合,修正成:
path("blogpost/<int:id>", views.blogpost, name="blogpost")
4. 排查模型主键问题
要是怀疑post_id主键有问题,去看Blog1模型的定义:
- 如果你手动设了
post_id当主键,得确保写了post_id = models.AutoField(primary_key=True) - 要是没手动设主键,Django会自动生成
id字段当主键,这时候视图里得改成Blog1.objects.get(id=id),URL里的<int:id>不用改。
内容的提问来源于stack exchange,提问作者Kathan2312
相关产品推荐
相关产品推荐

