将对象级别权限添加到通用视图

时间:2012-04-26 03:45:44

标签: django django-views django-permissions

情况很简单: 我正在写一个多用户博客系统。系统应阻止非所有者编辑或删除博客帖子。在我看来,我使用通用视图。

类BlogUpdateView(UpdateView): ...

我知道我应该使用@method_decorator来装饰调度方法。但是,大多数示例只是@method_decorator(login_required)或模型级别权限。如何应用对象级权限来检查request.user是否是此博客文章的作者? 例如,我尝试使用django-authority应用程序,我在此文件中有一个BlogPermission类。我尝试在这个类中定义一个方法,例如。

def blog_edit(self, ??, ??)

我应该在这个方法中加入什么?

然后将其称为: @method_decorator(permission_required('blog_permission.blog_edit(???)'))

我应该在这里传递什么?

更新:在读取method_decorator代码后,我发现它只能接受没有参数的函数。我认为这就是为什么permission_required在这里不起作用的原因。但是关于这个的工作是什么?

更新解决方案:

在调度方法中,我检查用户权限,如果用户不符合许可,则返回HttpResponseForbidden()。

1 个答案:

答案 0 :(得分:11)

您可以使用基于类的视图执行此操作:

class BlogEdit(UpdateView):
    model = Blog

    def dispatch(self, request, *args, **kwargs):
        if not request.user.has_perm('blog_permission.blog_edit'):
            return HttpResponseForbidden()
        return super(BlogEdit, self).dispatch(request, *args, **kwargs)

    # OR (for object-level perms)

    def get_object(self, *args, **kwargs):
        obj = super(BlogEdit, self).get_object(*args, **kwargs)
        if not obj.user == self.request.user:
            raise Http404 # maybe you'll need to write a middleware to catch 403's same way
        return obj