【问题标题】:Django 2.1 - DeleteView - only owner can delete or redirectDjango 2.1 - DeleteView - 只有所有者可以删除或重定向
【发布时间】:2019-03-11 10:54:35
【问题描述】:

我正在做一个包含一份小报纸的练习,我只想允许文章创建者删除它,否则,重定向到“主页”页面。但是,这不起作用,我只能提高 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') 

不是“raise Http404”,而是 Django 抛出这个错误:

'HttpResponseRedirect' object has no attribute 'delete'

解决这种行为的方法是什么?为什么会这样?

感谢您的帮助!!


编辑:(在@SK.Fazlee Rabby 评论之后,该帖子让我走上了正确的道路)

这很好用!谢谢,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)

【问题讨论】:

标签: python django django-class-based-views


【解决方案1】:

首先 如果您需要更改删除对象的行为,您应该覆盖删除方法而不是 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')

【讨论】:

  • 嗨,Andrey,这可行,但删除过程分为两步。单击第一个按钮时,我们将进入确认页面。使用您的代码允许不是作者的用户访问确认页面,尽管单击时重定向到“主页”页面,这是我想要实现的行为。您将如何阻止该用户访问确认删除页面?塔
猜你喜欢
  • 2023-02-11
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 2019-09-09
  • 1970-01-01
相关资源
最近更新 更多