阅读文档让我明白Django中的默认权限系统与模型相关联,这是可以理解的,因为它是为管理界面创建的。
这对于观点意味着什么?如果我只使用视图权限,那么连接到权限的模型是否会被使用?
这是让这个问题更具体一点。我的目标是将视图限制为一个特定的用户组。
创建ContentType:
content_type = ContentType.objects.get(app_label='myapp', model='SomeModel')
创建权限:
permission = Permission.objects.create(codename='can_view_this',
name='Can Access this View',
content_type=content_type)
创建一个组:
group = Group.objects.get_or_create(name='some_group')
向群组添加权限:
group.permissions.add(permission)
将用户添加到群组中:
group.user_set.add(User.objects.get(id=1))
测试许可:
@user_passes_test(lambda u: u.has_perm('myapp.can_view_this'))
def some_view(request):
回到第1步,注意我必须分配模型才能创建ContentType,并且我必须创建ContentType,因为创建Permission条目需要ContentType。
所以问题是,在这种情况下,SomeModel
一直在使用{{1}}吗?我甚至不确定究竟是哪个模型分配视图特定的权限,没有任何意义。
希望这个问题有道理。
答案 0 :(得分:1)
在上面的方案中,SomeModel
未在第六步中发布的视图代码中直接使用。但是,如果要完整编写def some_view
,您会发现自己正在使用SomeModel
来查询(即查看)对象。
@user_passes_test(lambda u: u.has_perm('myapp.can_view_this'))
def some_view(request, template_name='some_template.html'):
queryset = SomeModel.objects.filter(foo='bar')
return render(request, template_name, {'queryset': queryset})
在其他视图中,您会发现自己正在删除对象:
@user_passes_test(lambda u: u.has_perm('myapp.delete_somemodel'))
def some_delete_view(request, pk, template_name='some_template.html'):
object = SomeModel.objects.get(pk=pk)
object.delete()
return render(request, template_name, {})
在您的示例中没有任何隐含使用django模型权限的内容,这取决于您。
默认情况下,Django模型具有三个权限:添加,更改,删除。您可以像上面那样添加自定义权限,也可以节省一些时间,pecify them on the Model's Meta class。