我需要使用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个权限,但对此模型类按照要求进行操作感到困惑。
答案 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')