2017-08-16 51 views
1

我需要为使用Django和Python的注册用户设置权限。我做了一些事情,但不知道它是否满足我的要求。我在下面解释我的代码。如何根据用户使用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"), 
     ) 

我使用Django装饰功能,像@permission_required访问这些许可。在这里,我需要按用户设置3个权限,但是这个模型类正在按照需求进行混淆。

回答

0

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

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

用户对象有两个多对多字段: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') 
+0

您可以编辑按我的权限集。在哪个文件中,我将定义代码的第一部分,'BlogPost'是应用程序名称的权利?在这里我需要根据不同的用户设置三种不同的权限。 – satya

+0

@satya查看编辑。 BlogPost是应用程序名称。您还需要为每个用户明确使用权限模型授予权限。迁移后获得Permission对象并使用它来授予用户权限。 –

+0

权限将在管理页面内设置,而不是任何登录用户,你的意思是'从django.contrib.auth。模型导入权限,用户 DEF grant_permissions(请求): 用户= request.user CONTENT_TYPE = ContentType.objects.get_for_model(植物) 权限= Permission.objects.get( 代号= 'change_plant', CONTENT_TYPE = CONTENT_TYPE, ) user.user_permissions.add(permission)',我需要在views.py中这样写。 – satya