Python 为什么跟随者计数在django上不起作用
我一直在尝试在django上实现一个follow/unfollow系统,其中用户可以跟随其他用户,也可以跟随该用户,在用户的个人资料中,有一个following count,它显示用户正在跟踪多少人,还有一个following count,它应该显示用户有多少追随者,就像在instagram中一样。除了不计算跟随者的跟随者计数之外,一切都正常。为了进行跟随者计数,我使用了信号,但它不起作用。我如何解决这个问题 models.pyPython 为什么跟随者计数在django上不起作用,python,django,django-models,django-forms,django-views,Python,Django,Django Models,Django Forms,Django Views,我一直在尝试在django上实现一个follow/unfollow系统,其中用户可以跟随其他用户,也可以跟随该用户,在用户的个人资料中,有一个following count,它显示用户正在跟踪多少人,还有一个following count,它应该显示用户有多少追随者,就像在instagram中一样。除了不计算跟随者的跟随者计数之外,一切都正常。为了进行跟随者计数,我使用了信号,但它不起作用。我如何解决这个问题 models.py class Profile(models.Model):
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
profile_pic = models.ImageField(upload_to='profile_pics', null=True, blank=True, default='default.png')
bio = models.CharField(max_length=400, default=1, null=True)
connection = models.CharField(max_length = 100, blank=True)
follower = models.IntegerField(default=0)
following = models.IntegerField(default=0)
def __str__(self):
return f'{self.user.username} Profile'
class Following(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
followed = models.ManyToManyField(User, related_name="followed")
follower = models.ManyToManyField(User, related_name="follower")
@classmethod
def follow(cls, user, another_account):
obj, create = cls.objects.get_or_create(user = user)
obj.followed.add(another_account)
print("followed")
@classmethod
def unfollow(cls, user, another_account):
obj, create = cls.objects.get_or_create(user = user)
obj.followed.remove(another_account)
print("unfollowed")
def __str__(self):
return f'{self.user.username} Profile'
views.py
def profile(request, username=None):
profile, created = Profile.objects.get_or_create(user=request.user)
if username:
post_owner = get_object_or_404(User, username=username)
profile_bio = Profile.objects.filter(user_id=post_owner)
user_posts = Post.objects.filter(user_id=post_owner)
user = User.objects.get(username=username)
is_following = Following.objects.filter(user=request.user, followed=user)
following_obj = Following.objects.get(user=user)
follower = following_obj.follower.count()
following = following_obj.followed.count()
else:
post_owner = request.user
user_posts = Post.objects.filter(user=request.user)
profile_bio = Profile.objetcs.filter(user=request.user)
args1 = {
'post_owner': post_owner,
'user_posts': user_posts,
'follower': follower,
'following': following,
'connection': is_following,
'profile_bio': profile_bio,
}
return render(request, 'profile.html', args1)
def follow(request, username):
main_user = request.user
to_follow = User.objects.get(username=username)
following = Following.objects.filter(user = main_user, followed = to_follow)
is_following = True if following else False
if is_following:
Following.unfollow(main_user, to_follow)
is_following = False
else:
Following.follow(main_user, to_follow)
is_following = True
resp = {
'following': is_following,
}
response = json.dumps(resp)
return HttpResponse(response, content_type="application/json")
signals.py
@receiver(m2m_changed, sender = Following.followed.through) # which list is changed
def add_follower(sender, instance, action, reverse, pk_set, **kwargs):
followed_users = [] # list of users main (logged ) user have followed
logged_user = User.objects.get(username = instance) # user who followed other users
for i in pk_set:
user = User.objects.get(pk = i)
following_obj = Following.objects.get(user = user)
followed_users.append(following_obj)
if action == "pre_add":
for i in followed_users:
i.follower.add(logged_user)
i.save()
if action == "pre_remove":
for i in followed_users:
i.follower.remove(logged_user)
i.save()
profile.html
{% if connection and not request.user == post_owner %}
<a type="button" class="button-caballo" id="follow" role="button" href="{% url 'follow' post_owner.username %}">Unfollow</a>
{% elif not connection and not request.user == post_owner %}
<a type="button" class="button-caballo" id="follow" role="button" href="{% url 'follow' post_owner.username %}">Follow</a>
{% endif %}
<div class="header-item">
{{follower}}
</div>
<div class="header-item">
{{following}}
</div>
{%if连接而不是请求。user==post_owner%}
{%elif not connection and not request.user==post_owner%}
{%endif%}
{{follower}}
{{following}
为什么要为追随者创建另一个字段?您可以从下表中获得追随者数量和用户,而不需要任何追随者字段
以下模型应仅包含用户,然后
您可以使用
following.objects.filter(followed=request.user)
嘿,伊萨姆!我刚刚尝试用
follower=following.objects.filter(followind=request.user)
更改follower=following\u obj.follower.count()
,并将其添加到html{follower.count}
。另外,我从下面的模型中删除了followers字段,它仍然不起作用。我做错了什么?你得到的结果是0还是null或其他什么,请问是什么错误?嘿,我意识到错误是django无法识别signals.py文件,所以现在我修复了这个问题,但是没有得到下面的计数,而是按钮不起作用。“跟随”按钮未跟随用户。如何解决这个问题。确保请求的用户具有追随者2。尝试将以下类(后跟字段)中的关系从ManyToManyField替换为一对OneToOneField使用OneToOneField时,signals.py上出现错误,@receiver(m2m\u已更改,sender=following.following.through)中第8行的文件“C:\Users\USER\startup\gstartup\accounts\signals.py”#哪个列表更改了AttributeError:“ForwardOneToOneDescriptor”对象没有“通过”属性