Django中“User”对象不可迭代。

3
我不知道为什么会出现这个错误。。
[ 'User' 对象不可迭代 ]
我想在主页上打印(已登录用户)的关注者。除了错误之外,我的 models.py 是否正确?用于关注和被关注机制。
模型:
class Follow(models.Model):
    following = models.ForeignKey('auth.User', related_name='following')
    followers = models.ForeignKey('auth.User', related_name='followers')

视图

def profile(request):
   current_user = request.user
   twi = Follow.objects.get(pk=current_user.id)
   display = twi.followers
   return render(request,'home.html' , 
       {'detail':display,'user':current_user,})

模板
{% for o in detail %}
<h1>o.followers</h1>
{% endfor %}

1
为什么你要尝试迭代它? - Daniel Roseman
用户只是request.user,而不是一个列表。 - gout
3个回答

7
您的逻辑有些混乱,您的detail指的是followers,但该字段本身是指向一个单一用户的链接,您需要将此字段设置为ManyToMany关系,或使用反向查找来查找用户关注的内容。
(您的上下文字典中还有一个杂散的逗号,这可能会在以后引起问题。)

2

get 方法返回单个查询集,您不能对其进行迭代,如果使用 get 方法,请在模板中使用此方法。

   <h1>{{ detail.followers }}</h1>

或者如果您需要多个
在视图中
twi = Follow.objects.filter(pk=current_user.id)

并更改此行

display = twi.followers

为了

display = twi

在模板中

标签的使用。
{% for o in detail %}
   <h1>{{ o.followers }}</h1>
{% endfor %}

1
get方法并不返回一个查询集,而是返回模型类的单个实例。.filter方法返回一个查询集,而使用.get方法相当于执行.filter()[0]操作,但如果过滤结果的长度大于1,它会失败。 - Brian H.

0
如果你想遍历 'detail' 并且不想改变模板中的代码,可以使用 filter() 查询,并将 'display' 设置为过滤查询的结果。 或者,如果你不打算更改视图代码,可以编辑模板代码从
{% for o in detail %} <h1>o.followers</h1> {% endfor %}
改为只有 <h1>{{detail}}</h1>

如果您像其他人一样添加一些解释,那就太好了。 - Arpit Solanki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接