Django 2.1 - DeleteView - только владелец может удалять или перенаправлять - PullRequest
0 голосов
/ 06 октября 2018

Я делаю упражнение, которое состоит из небольшой газеты, я хочу разрешить только создателю статьи удалить ее, в противном случае, перенаправить на «домашнюю» страницу.Но, это не работает, я только могу поднять Http404.

views.py:

class ArticleDeleteView(LoginRequiredMixin, DeleteView):
    model = Article
    template_name = 'article_delete.html'
    success_url = reverse_lazy('article_list')

    def get_object(self, queryset=None):
        """ Hook to ensure object is owned by request.user """
        obj = super(ArticleDeleteView, self).get_object()
        if not obj.author == self.request.user:
            print(redirect('home'))
            raise Http404
        return obj

Я пытался:

return redirect('home') 

Вместо"поднять Http404", но Django выдает эту ошибку:

'HttpResponseRedirect' object has no attribute 'delete'

Как решить эту проблему и почему это происходит?

Спасибо за вашу помощь !!


РЕДАКТИРОВАТЬ: (После @SK. Комментарий Фазли Рабби, этот пост поставил меня на правильный путь)

Это прекрасно работает!Спасибо, СК.Фазли Рабби

def dispatch(self, request, *args, **kwargs):
    """ Making sure that only authors can delete Articles """
    obj = self.get_object()
    if obj.author != self.request.user:
        messages.error(request, 'Document not deleted.')
        return redirect('article_list')
    messages.success(request, 'Document deleted.')
    return super(ArticleDeleteView, self).dispatch(request, *args, **kwargs)

1 Ответ

0 голосов
/ 06 октября 2018

Прежде всего, если вам нужно изменить поведение удаления объекта, вы должны перезаписать метод удаления, а не get_object, get_object только для получения объекта (если вы поднимаете 404, django обрабатывает эту ошибку и возвращает http404)

вам следуетнапишите код так:

class ArticleDeleteView(LoginRequiredMixin, DeleteView):
    model = Article
    template_name = 'article_delete.html'
    success_url = reverse_lazy('article_list')

    def delete(self, request, *args, **kwargs):
        """
        Call the delete() method on the fetched object and then redirect to the
        success URL.
        """
        self.object = self.get_object()
        success_url = self.get_success_url()
        if self.object.author == self.request.user:
            return redirect('confirm_deleting', ) # Also add id of Article

        return redirect('home')


class ConfirmingArticleDeleteView(LoginRequiredMixin, DeleteView):
    model = Article
    template_name = 'article_delete.html' # need change
    success_url = reverse_lazy('article_list')

    def delete(self, request, *args, **kwargs):
        """
        Call the delete() method on the fetched object and then redirect to the
        success URL.
        """
        self.object = self.get_object()
        success_url = self.get_success_url()
        if self.object.author == self.request.user:
            self.object.delete()
            return redirect('home')

        return redirect('home')
...