【问题标题】:Why is the follower count not working on django为什么追随者数量在 django 上不起作用
【发布时间】:2020-11-10 23:18:22
【问题描述】:

我一直在尝试在 django 上实现一个关注/取消关注系统,其中用户可以关注其他用户并且用户也可以被关注,在用户的个人资料中有一个关注计数,显示用户关注了多少人和一个追随者计数,它应该显示用户在 Instagram 中的追随者数量。除了不计算追随者的追随者数量外,一切都运行良好。为了做这个追随者计数,我使用了信号,但它不起作用。我该如何解决这个问题?

models.py

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")

信号.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>

【问题讨论】:

    标签: python django django-models django-forms django-views


    【解决方案1】:

    为什么要为关注者创建另一个字段?您可以从同一个下表中获取关注者数量和用户,而无需关注者字段。

    您的以下模型应仅包含用户,已关注 您可以通过使用获得关注者

    following.objects.filter(followed=request.user)
    

    【讨论】:

    • 嘿伊萨姆!我刚刚尝试将follower = following_obj.follower.count() 更改为follower = Following.objects.filter(followed=request.user),并将其添加到html {{ follower.count }}。此外,我从以下模型中删除了关注者字段,但它仍然无法正常工作。我做错了什么?
    • 你得到的结果是 0 还是 null 或者别的什么,请问是什么错误?
    • 嘿,我意识到错误是django无法识别signals.py文件,所以现在我修复了这个问题,但是没有弹出以下计数,按钮不起作用。关注按钮未关注用户。如何解决?
    • 1.确保请求的用户有关注者 2. 尝试将以下类(关注的字段)中的关系从 ManyToManyField 替换为 one to OneToOneField
    • 使用 OneToOneField 时,signals.py 出现错误,上面写着 File "C:\Users\USER\startup\gstartup\accounts\signals.py", line 8, in &lt;module&gt; @receiver(m2m_changed, sender = Following.followed.through) # which list is changed AttributeError: 'ForwardOneToOneDescriptor' object has no attribute 'through'
    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 2016-11-16
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    相关资源
    最近更新 更多