Django 通用 UpdateView. 如何检查凭证

0 投票
1 回答
955 浏览
提问于 2025-04-18 17:23

我想要能够编辑一篇帖子并保存它。

到目前为止,我已经成功实现了这一点,并且还加了一个检查,看看用户是否登录。

不过,我找不到如何验证用户是否有权限这样做的方法。

这是我的代码:

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)

在我的帖子模型中,有一个叫“owner_user”的字段,它保存了一个用户的外键:

owner_user = models.ForeignKey(User)

我想在我的 urls.py 文件中使用我有的 pk 变量。

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

然后检查一下,做类似这样的事情:

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

我该如何实现这个呢?

1 个回答

6

添加一个叫做 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)

撰写回答