使用user_passes_test限制访问权限以按组查看或登录用户

时间:2019-06-30 00:31:20

标签: python django

用户具有个人资料,我试图限制他们对个人资料的访问,同时允许管理组中的用户访问所有个人资料。

理想情况下,我希望通过带有一个函数的装饰器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)

1 个答案:

答案 0 :(得分:0)

该代码中有几个错误,但是无论如何这不是您可以在user_passes_test函数中执行的;该请求未通过,因此无法判断用户是否正在访问自己的个人资料。

在视图内部执行此操作。

相关问题