Любой может удалить или обновить пост другого через URL - PullRequest
1 голос
/ 23 июня 2019

Hy, я занимаюсь разработкой приложения для блога Django.В этом приложении у меня есть представление PostEdit для редактирования сообщения, Удалить представление для удаления сообщения.Эти операции могут быть выполнены только тем пользователем, который создал этот пост.Я использовал Удалить вид как функциональный вид и редактировать вид как 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 Ответ

1 голос
/ 23 июня 2019

Вы можете отфильтровать набор запросов вошедшего в систему пользователя, переопределив метод get_queryset [Django-doc] , например:

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

    def <b>get_queryset</b>(self):
        return super().get_queryset()<b>.filter(author=self.request.user)</b>

    # ...

InЕсли пользователь стремится отредактировать Post, из которых он / она , а не автор.Представление вызовет ошибку 404.

...