使用Django-Friendship API实现关注功能异常:始终显示取消关注按钮
Django-Friendship 关注/取消关注按钮显示异常排查
使用Django-Friendship API实现关注/取消关注功能时,页面始终显示「取消关注」按钮,无法根据实际关注状态切换按钮。相关模板代码如下:
{% if user.id not in request.user.following %} <a class='btn btn-success' href="{% url 'addFollowing' user.id %}">Follow @{{user.username}} </a> {% else %} <a class='btn btn-danger' href="{% url 'removeFollowing' user.id %}">Unfollow</a> {% endif %}
问题原因
request.user.following是Django-Friendship提供的管理器对象,并非存储用户ID的列表或集合。直接用user.id not in request.user.following进行判断时,该条件永远返回False,导致模板始终渲染「取消关注」按钮。
解决方案
方案1:在模板中使用管理器的查询方法判断
利用following管理器的filter()和exists()方法直接判断是否已关注目标用户,修改模板逻辑:
{% if not request.user.following.filter(id=user.id).exists %} <a class='btn btn-success' href="{% url 'addFollowing' user.id %}">Follow @{{user.username}} </a> {% else %} <a class='btn btn-danger' href="{% url 'removeFollowing' user.id %}">Unfollow</a> {% endif %}
方案2:在视图中提前计算关注状态
将关注状态的判断逻辑移到视图层,把结果作为上下文变量传递给模板,让模板更简洁:
视图代码示例
from django.shortcuts import render, get_object_or_404 from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User @login_required def user_profile(request, user_id): target_user = get_object_or_404(User, id=user_id) is_following = request.user.following.filter(id=target_user.id).exists() return render(request, 'profile.html', {'user': target_user, 'is_following': is_following})
模板代码修改
{% if not is_following %} <a class='btn btn-success' href="{% url 'addFollowing' user.id %}">Follow @{{user.username}} </a> {% else %} <a class='btn btn-danger' href="{% url 'removeFollowing' user.id %}">Unfollow</a> {% endif %}
额外注意事项
- 确保访问页面的用户已登录,给相关视图添加
@login_required装饰器,避免未认证用户访问时request.user.following报错。 - 检查
addFollowing和removeFollowing视图的逻辑:添加关注需调用request.user.following.add(target_user),取消关注调用request.user.following.remove(target_user),操作完成后要正确重定向回页面,确保页面状态及时更新。
内容的提问来源于stack exchange,提问作者Zaidan Chaudhary
相关产品推荐
相关产品推荐

