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

时间:2016-02-15 19:45:16

标签: python django permissions decorator user-profile

我是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'))

你们可以看到我是一个绝对的初学者,不幸的是,所有的文件和例子都没有对我有任何好处,而我更加困惑。 我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

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

首先,定义一些在您与应该能够看到您的内容的用户打交道时返回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是指如果用户未通过您所指示的测试,则会向其发送。

相关问题