Xin*_*han 8 django django-views django-permissions
情况非常简单:我正在编写一个多用户博客系统.系统应阻止非所有者编辑或删除博客帖子.在我看来,我使用通用视图.
class 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().
ilv*_*var 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
Run Code Online (Sandbox Code Playgroud)