首页 > 解决方案 > 使用 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)

标签: pythondjango

解决方案


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

在视图内执行此操作。


推荐阅读