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
。看起来您的 UserTypeOne
和 UserTypeTwo
模型以一对一的关系扩展了基础 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
是如果用户未通过您指定的测试将被发送到的位置。
我是 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
。看起来您的 UserTypeOne
和 UserTypeTwo
模型以一对一的关系扩展了基础 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
是如果用户未通过您指定的测试将被发送到的位置。