python - django模板上的关注/取消关注按钮
问题描述
我有一个 django 关注系统,用户可以在其中关注其他用户,也可以像在 instagram 中一样取消关注他们。为了关注用户,该人必须访问某人的个人资料并按下关注按钮,如果用户已经关注该人,则用户可以按下取消关注按钮。同样在个人资料中,有一个关注者计数显示用户拥有的关注者数量和一个关注者计数显示用户关注的用户数量(再次像 instagram 中一样)。
好吧,一切都差不多完成了,我只是错过了我添加了一个 signals.py 文件的关注者数量。当该文件完成后,我意识到现在按钮不起作用,因为当用户按下跟随按钮时,它不会跟随用户。我能做些什么来让这个按钮完成他们的工作,即关注和取消关注人?请任何想法帮助。
模型.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'
视图.py
def profile(request, username=None):
profile, created = Profile.objects.get_or_create(user=request.user)
user = User.objects.filter(username=username)
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[0]
conn = profile.connection
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 = {
'user_obj':user,
'conn':conn,
'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
<div class="header-item">
followers: {{ follower }}
</div>
<div class="header-item">
following: {{ following }}
</div>
{% if connection %}
<a type="button" class="button-caballo" id="follow" role="button" href="{% url 'follow' user_obj.username %}">Unfollow</a>
{% elif not connection %}
<a type="button" class="button-caballo" id="follow" role="button" href="{% url 'follow' user_obj.username %}">Follow</a>
{% endif %}
有任何问题请在评论中告诉我;)
解决方案
推荐阅读
- sql - 如何根据在 oracle 中具有空值的列从两个不同的列中进行选择
- python - Pygame 表面位置似乎与屏幕上的位置不同?
- python - Cython - 动态 2D C++Array 的 Memoryview
- mongodb - MongoDB按偶数元素将数组拆分为N元素数组
- c# - 寻找着陆点
- json - Nil 与预期的参数类型“JSON”不兼容
- c# - 用于 IList 的 WPF 数据网格
- 无法添加新值 - authentication - 我重新启动节点红色,但用户仍然登录
- mysql - 当没有匹配的数据而不是返回 0 行时,有没有办法返回一个为零的列?
- redis - Redisson本地缓存使用