如何使用请求用户属性

时间:2016-11-25 12:32:23

标签: django django-templates user-permissions perms

我开发了一个django应用程序,注册用户并根据资源级别权限提供资源。这个我在我的模型和模板上使用django基本级别权限,有查看权限我在我的模型中设置了权限元组,如:

class Model(AbstractUser):
    group = models.ForeignKey(AppGroup)
    class Meta:
        permissions = ( ('view_app', 'user can view app'), )

我在创建上面的模型后迁移我的模型。

现在对于权限,我从管理员创建了一个组并包括所有应用程序视图/更改/删除权限,使用该组我在表单类中生成了一个下拉列表。现在,用户(admin)可以根据所选权限创建其他用户,并在成功注册后,新用户能够成功登录并访问所有资源,但是当我尝试访问用户权限时,使用类似

class UserListView(ListView):
     def get_queryset(self):
         print(self.request.user.user_permissions.all())
         return super(UserListView, self).get_queryset()

当我列出我的视图时,它会给我一个关系错误(500错误): enter image description here     关系views_list_user_permission不存在

现在,当我通过超级用户访问同一个视图时,它给了我所有权限,但是从既不是超级用户也不是工作人员的用户,它会吐出上述错误。通过查看djancgo.contrib.auth.models PermissionMixin类代码,我觉得user_permissions m2m字段只能由超级用户访问,但我对此表示怀疑。所以这就是我正在做的并且遇到了问题,如果我采取错误的方式,请纠正我

1 个答案:

答案 0 :(得分:1)

超级用户拥有所有授予的权限集。因此,您可以看到所有权限。但是当创建新用户时,他将不会设置任何权限,因此用户和权限之间没有任何关系,因此您将收到上述错误。

Note:-

您可以使用

检查模板中登录用户的可用权限
{{ perms }}

对于特定应用: -

{{ perms.app_name }}

对于特定型号: -

{{ perms.app_name.model_name }}

假设您要授予对具有特定模型特定权限的用户的访问权限,您可以使用如下所示的权限所需的装饰器: -

from django.contrib.auth.decorators import permission_required
@permission_required('polls.can_vote')
def my_view(request):
...

现在,具有权限can_vote的用户在"民意调查"将被允许​​访问授权。

有关详细用途,请参阅: -

Django documentation on permissions.

身份验证后端负责用户权限。我猜你正在使用自己的自定义身份验证后端。但是,如果您这样做,您可能忘记导入ModelBackend。 from django.contrib.auth.backends import ModelBackend

现在确保将此后端扩展到您自己的自定义后端

class EmailBackend(ModelBackend):