Django 权限取决于模型?
Posted
技术标签:
【中文标题】Django 权限取决于模型?【英文标题】:Django permissions depend on models? 【发布时间】:2013-06-30 15:12:56 【问题描述】:阅读文档让我了解到 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】:在您的上述场景中,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 模型具有三个权限:添加、更改、删除。您可以像上面那样添加自定义权限,或者为了节省一些时间,specify them on the Model's Meta class。
【讨论】:
以上是关于Django 权限取决于模型?的主要内容,如果未能解决你的问题,请参考以下文章