python - 使用 user_passes_test 限制访问按组或登录用户查看
问题描述
用户有个人个人资料,我试图限制他们对个人个人资料的访问,同时允许管理员组中的用户访问所有个人资料。
理想情况下,我希望通过具有一个功能的装饰器 user_passes_test 来实现这一点。如果需要,我可以使用两个不同的函数,每个函数都有一个装饰器。尽管将所有内容合二为一可能会更清洁。
# Views.py
def profile_access(CustomUser, request):
officer = CustomUser.groups.filter(name='Officer')
logged_in_user = request.self.CustomUser
if officer or logged_in_user:
return True
else:
return redirect('homepage')
@user_passes_test(profile_access)
def profile(request, pk):
# Profile content here
我不确定如何识别登录用户以将他们限制在他们的个人资料中,同时还允许官员组中的用户查看所有个人资料。
更新:
# accounts models.py
class CustomUser(AbstractUser):
display_name = models.CharField(max_length=50, unique=True)
authorization_code = models.CharField(max_length=20)
email = models.EmailField(max_length=50, unique=True)
def __str__(self):
return self.display_name
def get_absolute_url(self):
return reverse('profile-home', args=[str(self.pk)])
class Profile(models.Model):
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
active = models.BooleanField(default=True)
officer = models.BooleanField(default=False)
bio = models.TextField(max_length=1000)
regdate = models.DateField(default=date.today)
active_player = models.BooleanField(default=True)
clan_battle_status = models.BooleanField(default=False)
captain = models.ManyToManyField(ShipCaptain)
ships = models.ManyToManyField(NavalShip)
def __str__(self):
return str(self.user)
解决方案
该代码中有几个错误,但无论如何这不是您可以在 user_passes_test 函数中执行的操作;请求未通过,因此无法判断用户是否正在访问他们自己的个人资料。
在视图内执行此操作。