Django相关的用户模型——权限和装饰器

Django related User Model - Permissions and Decorators

我是 Django 的初学者,我正在尝试使用权限来允许通过装饰器访问特定的视图功能,仅适用于特定的用户类型。现在我完全被我读过的各种东西搞糊涂了,不知道我应该怎么做。 我有两种不同类型的用户,分别是 UserTypeONE 和 UserTypeTWO。 UserTypeONE 和 UserTypeTWO 应该只能访问特定的视图。 这是我的代码:

myuserTypes.py

class UserTypeONE(models.Model): 
    lieOtO_User = models.OneToOneField(settings.AUTH_USER_MODEL)
    lie_SomeAttribute= models.CharField(max_length=300, help_text ='Name')

    class Meta:
        permissions = (('Can_View_MyShop', 'Can see Shop View'),)

class UserTypeTWO(models.Model): 
    lieOtO_User = models.OneToOneField(settings.AUTH_USER_MODEL)
    lie_SomeOtherAttribute= models.CharField(max_length=300, help_text ='Name')

    class Meta:
        permissions = (('Can_View_Targets', 'Can see the Targets'),)

这是我在 views.py

中尝试做的事情
@login_required
@permission_required('UserTypeONE.Can_View_MyShop', raise_exception=True)
def MyShopView(request):
    #do something

我也试过

@user_passes_test(lambda u: u.usertypeone.permission('Can_View_MyShop'))

正如你们所看到的,不幸的是,我是一个绝对的初学者,所有的文档和示例对我没有任何帮助,反而让我更加困惑。 非常感谢对此的帮助。

我会在这里使用 user_passes_test(),因为您特别想限制特定的视图。

首先,定义几个函数,当您与应该能够看到您的内容的用户打交道时,它们 return True。看起来您的 UserTypeOneUserTypeTwo 模型以一对一的关系扩展了基础 User 模型,因此您可以使用 hasattr 检查给定的基础用户是否具有以下属性之一:

def type_one_only(user):
    if hasattr (user, 'usertypeone'):
        return True
    else:
        return False

def type_two_only(user):
    #same thing without if/else
    return hasattr(user, 'usertypetwo')

现在,当您有一个视图要限制为一种用户类型时,您可以在它之前添加一个 user_passes_test 装饰器:

@user_passes_test(type_one_only, login_url='/')
def my_view(request):
    ...

login_url 是如果用户未通过您指定的测试将被发送到的位置。