Django UpdateView中的对象所有权验证

时间:2013-08-11 12:53:10

标签: django django-views django-class-based-views

修改

对我来说更好的解决方案就是使用权限系统,特别是因为我需要对对象进行其他类型的受控访问。我现在使用Django-guardian来帮助这样的对象级权限。

原始

我正在扩展标准django书籍指南,让用户上传故事,以及有作者,出版商等。我试图让故事的作者(创作者)使用更新视图,其他用户被重定向。

在UpdateStory视图中修改get_object将其设置为关闭,但由于某种原因,回溯将通过我的StoryForm init 。错误为'HttpResponseRedirect' object has no attribute '_meta'

views.py

class UpdateStory(LoginRequiredMixin, UpdateView):
    model = Story
    template_name = 'stories/story_update.html'
    form_class = StoryForm

    def get_object(self, queryset=None):
        obj = super(UpdateStory, self).get_object()
        if not obj.author == self.request.user:
            return redirect(obj)
        return obj

forms.py

class StoryForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(StoryForm,self).__init__(*args, **kwargs)

我还是新手,所以可能很明显,但我一直在寻找几个小时而且我很难过。

2 个答案:

答案 0 :(得分:4)

http://ccbv.co.uk/projects/Django/1.5/django.views.generic.edit/UpdateView/

浏览上面的链接,了解UpdateView的工作原理。 get_object应该返回模型实例,它不应该返回HttpResponseRedirect对象,这就是你得到错误的原因。

尝试使用以下dispatch方法进行检查。

def dispatch(self, request, *args, **kwargs):
    """ Making sure that only authors can update stories """
    obj = self.get_object()
    if obj.author != self.request.user:
        return redirect(obj)
    return super(UpdateStory, self).dispatch(request, *args, **kwargs)
  

PS:我想不建议覆盖调度。但是就像你一样   必须检查get和post方法,覆盖dispatch   会更容易。

答案 1 :(得分:2)

最好的方法是使用另一种mixin,如下所示:

class AuthorRequiredMixin(object):
    def dispatch(self, request, *args, **kwargs):
        if self.object.author != self.request.user:
            return HttpResponseForbidden()
        return super(AuthorRequiredMixin, self).dispatch(request, *args, **kwargs)

当然你可以返回另一个HttpResponse,但请记住这里有什么用途。