Django社交网站点击关注按钮报错:User matching query does not exist
问题分析
错误User matching query does not exist出现在Profile_view的user_object = User.objects.get(username=pk)行,核心原因是Follow视图重定向时传递的参数错误,导致pk不是有效的用户名字符串,进而触发查询失败。
修复步骤
1. 修正Follow视图的重定向参数
原代码中return redirect('profile',username=follower_user)直接传递了User对象,但Profile_view接收的pk是用户名字符串,需改为传递对象的username属性:
def Follow(request): if request.method == "POST": follower_username = request.POST.get('follower') user_username = request.POST.get('user') # 先校验POST参数是否存在,避免KeyError if not follower_username or not user_username: return redirect('home') # 增加用户查询的异常处理,避免无效用户名导致崩溃 try: follower_user = User.objects.get(username=follower_username) user_user = User.objects.get(username=user_username) except User.DoesNotExist: return redirect('home') # 用exists()判断关注关系更高效 if FollowersCount.objects.filter(follower=follower_user, user=user_user).exists(): FollowersCount.objects.filter(follower=follower_user, user=user_user).delete() else: # create()方法自动保存,无需额外调用save() FollowersCount.objects.create(follower=follower_user, user=user_user) # 修正:传递用户名字符串而非User对象,参数名要和URL配置一致 return redirect('profile', pk=follower_user.username)
注意:如果你的URL配置中Profile_view的参数名是
username,就把pk=改成username=,必须和urls.py里的定义完全匹配。
2. 给Profile_view增加异常处理(推荐)
即使传参正确,也要处理用户/Profile不存在的情况,避免页面崩溃:
def Profile_view(request,pk): try: user_object = User.objects.get(username=pk) except User.DoesNotExist: # 重定向到首页或404页面 return redirect('home') # 处理Profile不存在的情况,自动创建默认Profile或返回错误 try: user_profile = Profile.objects.get(user=user_object) except Profile.DoesNotExist: user_profile = Profile.objects.create(user=user_object) user_post = Post_Upload.objects.filter(user=user_object) following_count = FollowersCount.objects.filter(follower=user_object).count() followers_count = FollowersCount.objects.filter(user=user_object).count() post_count = user_post.count() context = { "user_profile":user_profile, "user_post":user_post, "post_count":post_count, "following_count":following_count, "followers_count":followers_count, } return render(request, 'profile.html',context)
3. 检查URL配置一致性
确保urls.py中Profile_view的参数定义和视图接收的参数名一致,比如:
path('profile/<str:pk>/', views.Profile_view, name='profile'),
如果URL里写的是<str:username>,视图函数就要改成def Profile_view(request, username):,同时重定向时用username=follower_user.username。
内容的提问来源于stack exchange,提问作者Aneeb
相关产品推荐
相关产品推荐

