超级用户封禁用户后被封用户仍可发帖,views.py是否遗漏逻辑?
问题分析与修复方案
1. HTML模板的关键错误
你当前的Ban按钮传递的是post.id而非帖子作者的user.id:
<button type="submit" class="btn btn-warning" value={{post.id}} name="user_id">Ban User</button>
这会导致后端拿到的user_id是帖子ID,而非要封禁的用户ID。虽然控制台提示"移除成功",但实际操作的可能是错误的用户(甚至不存在的用户——User.objects.filter(id=post_id).first()可能返回None,但无判断的情况下执行group.user_set.remove(None)不会报错,所以控制台打印成功但实际无效果)。
修复:把按钮的value改为帖子作者的ID:
<button type="submit" class="btn btn-warning" value={{post.auther.id}} name="user_id">Ban User</button>
2. 封禁逻辑的缺失
仅移除用户分组不足以阻止用户创建帖子,因为:
- 如果用户本身(不在分组时)仍拥有创建帖子的权限,移除分组不会剥夺该权限
- 你没有限制被封禁用户的登录或操作权限
可选修复方案:
方案一:禁用用户账号(最直接)
将被封禁用户的is_active设为False,这样用户无法登录:
elif user_id: user = User.objects.filter(id=user_id).first() if user and request.user.is_staff and user != request.user: # 防止管理员误封自己 user.is_active = False user.save() # 可选保留移除分组操作 try: group = Group.objects.get(name="default") group.user_set.remove(user) except Group.DoesNotExist: pass try: group = Group.objects.get(name="mode") group.user_set.remove(user) except Group.DoesNotExist: pass
方案二:权限校验拦截(保留账号但限制操作)
如果需要保留用户账号但禁止创建帖子,需在创建帖子的视图中添加权限校验:
@login_required(login_url='login') def create_post(request): # 检查用户是否在允许的分组中 allowed_groups = ["default", "mode"] user_in_allowed = request.user.groups.filter(name__in=allowed_groups).exists() if not user_in_allowed: return HttpResponse("你已被封禁,无法创建帖子") # 其余创建帖子的逻辑...
3. 代码优化建议
- 捕获异常时不要用
except:,应该捕获具体异常(比如Group.DoesNotExist),避免隐藏其他错误 - 增加对
user是否存在的判断,避免对None执行操作 - 禁止管理员封禁自己,添加
user != request.user的判断
内容的提问来源于stack exchange,提问作者Aneeb
相关产品推荐
相关产品推荐

