如何使用Django和Python为用户设置权限?

时间:2017-08-16 05:52:17

标签: python django

我需要使用Django和Python按照注册用户设置权限。我做了一些事情,但是是否满足了我的要求。我在下面解释我的代码。

class Control(models.Model):
    """docstring for Control"""

    user_id = models.ForeignKey(User)
    control_reactor = models.IntegerField(default=0)
    find_reactor = models.IntegerField(default=0)
    view_reactor = models.IntegerField(default=0)
    class Meta:
        """docstring for Meta"""
        permissions = (
            ("view_reactor", "can view reactor"),
            ("find_reactor", "can find reactor"),
            ("controll_reactor", "can controll reactor"),
        )

我使用像@permission_required这样的Django装饰器函数来访问这些权限。在这里,我需要根据用户设置3个权限,但对此模型类按照要求进行操作感到困惑。

1 个答案:

答案 0 :(得分:1)

定义的元类只是表示模型将只具有这些权限,因此它变得易于管理。

您可以使用django中的Permission类以编程方式创建权限。来自django docs

  

用户对象有两个多对多字段:groups和user_permissions。用户对象可以像访问任何其他Django模型一样访问其相关对象

权限模型存储可以设置给特定用户的所有权限。您所要做的就是添加创建权限并将其添加到用户。

from django.contrib.auth.models import Permission, User
content_type = ContentType.objects.get_for_model(BlogPost)
permission = Permission.objects.get(
    codename='change_blogpost',
    content_type=content_type,
)
user.user_permissions.add(permission)

相关名称为user_permissions,因此您可以直接添加与M2M关系相同的权限。

现在假设您要检查权限

user.has_perm('app_name.code_name') # generic example
user.has_perm('myapp.change_blogpost')

现在装饰师可以做同样的事情

@permission_required('app_name.code_name') 

编辑:通常您在创建用户时授予权限,因此上述示例可以放在您注册用户的视图中。如果您不想立即授予权限,那么您可以创建一个单独的视图,授予用户权限

def grant_permissions(request):
    user = request.user
    # then you put the code mentioned above 

对于您的情况,您可以使用权限模型在代码中创建权限,也可以使用元类。

只需迁移数据库即可创建元类中定义的权限。迁移后不要忘记使用权限模型使用上述代码授予用户权限然后您可以使用装饰器中的权限。

@permission_required('view_reactor')