任何人都可以通过url删除或更新其他人的帖子

时间:2019-06-23 15:24:33

标签: django django-models django-authentication django-permissions

嘿,我正在开发Django Blog应用程序。在此应用程序中,我具有PostEdit视图来编辑帖子,而Delete Delete视图则可以删除帖子。这些操作只能由创建该帖子的用户执行。我使用了删除视图作为功能视图,并使用了CBV编辑视图。现在发生的事情是,任何用户都可以通过URL删除或编辑其他用户。在我的删除帖子视图中,由于它是基于功能的视图,因此我使用if条件阻止另一个用户阻止删除其他人的帖子。但是由于要进行帖子编辑,所以我使用的是CBV,因此无法找到阻止用户编辑他人帖子的方法。

那么如何防止其他用户编辑其他人的帖子?


class PostUpdateView(LoginRequiredMixin ,UpdateView):
    model = Post
    template_name = 'blog/post_form.html'
    form_class = PostForm

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['title'] = 'Update'
        return context

    def form_valid(self, form):
        form.instance.author = self.request.user
        form.save()
        return super().form_valid(form)


@login_required
def post_delete(request, slug):
    post = get_object_or_404(Post, slug=slug)
    if (request.user == post.author):
        post.delete()
        return redirect('blog:post_list')
    else:
        return redirect('blog:post_detail', slug=slug)

1 个答案:

答案 0 :(得分:1)

您可以通过覆盖get_queryset method [Django-doc]来过滤登录用户的查询集,例如:

class PostUpdateView(LoginRequiredMixin ,UpdateView):
    model = Post
    template_name = 'blog/post_form.html'
    form_class = PostForm

    def get_queryset(self):
        return super().get_queryset().filter(author=self.request.user)

    # ...

如果用户打算编辑自己不是作者的Post,则为 。该视图将引发404错误。