4

编辑:

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

原来的:

我通过让用户上传故事以及让作者、出版商等对标准 django 图书指南进行了一些扩展。我试图只让故事的作者(创作者)使用 updateview,而其他用户正在重定向了。

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

视图.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

表格.py

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

我还是新手,所以这可能很明显,但我一直在寻找几个小时,我被难住了。

4

2 回答 2

5

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 方法,因此覆盖调度会更容易。

于 2013-08-11T14:04:50.577 回答
5

最好的方法是使用另一个 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,但请记住这里的正确用途是什么。

于 2013-08-11T20:34:10.703 回答