Django 2.1 DeleteView只有所有者可以删除或重做

2024-07-02 13:03:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个练习,里面有一份小报纸,我只允许文章创建者删除它,否则,重定向到“主页”页面。但是,那没用,我只能提高Http404。在

在视图.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

我试着:

^{pr2}$

不是“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)

Tags: selfobjgetreturnobjectrequestdefarticle
1条回答
网友
1楼 · 发布于 2024-07-02 13:03:06

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

相关问题 更多 >