Django 通用更新视图。如何检查凭据

Dan*_*Dan 0 python django

我希望能够编辑帖子并保存它。

到目前为止,我已经设法做到了这一点,并实施了检查以查看用户是否已登录。

但是,我似乎无法找到如何验证用户是否有权这样做。

这是我的代码:

class PostUpdate(UpdateView):
    model = Post
    fields = ['title','body','page','category']
    template_name = 'post_update.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(PostUpdate, self).dispatch(*args, **kwargs)

    def form_valid(self, form):
        form.instance.owner_user = self.request.user
        return super(PostUpdate, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)

在我的 Post 模型中,我有一个名为“owner_user”的字段,其中包含一个 User 作为外键:

owner_user = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

我希望能够使用pk我的urls.py 中的变量

url(r'^post/(?P<pk>\d+)/edit',
    PostUpdate.as_view(),
    name='PostUpdate'),
Run Code Online (Sandbox Code Playgroud)

并检查它做这样的事情:

post = get_object_or_404(Post,id=pk)
if post.owner_user == request.user:
    #Show edit page
else:
    return HttpResponseForbidden()
Run Code Online (Sandbox Code Playgroud)

我怎么能做到这一点?

crh*_*des 5

添加一个 get_object 方法并检查用户是该对象的所有者,如下所示:

class PostUpdate(UpdateView):
    model = Post
    fields = ['title','body','page','category']
    template_name = 'post_update.html'

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(PostUpdate, self).dispatch(*args, **kwargs)

    def get_object(self, *args, **kwargs):
        obj = super(PostUpdate, self).get_object(*args, **kwargs)
        if not obj.owner_user == self.request.user:
            raise Http404
        return obj

    def form_valid(self, form):
        form.instance.owner_user = self.request.user
        return super(PostUpdate, self).form_valid(form)
Run Code Online (Sandbox Code Playgroud)

  • 没问题,请查看 [链接](http://ccbv.co.uk/) 以了解 Django 中基于类的视图的未来工作,这是很好地补充文档的重要资源 (2认同)