Django 2.1 - DeleteView - 只有所有者可以删除或重定向



我正在做一个由小报纸组成的练习,我只想允许文章创建者删除它,否则,重定向到"主页"。但是,这是行不通的,我只能提高 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评论之后,该帖子让我走上了正确的道路(

这很甜!谢谢,法兹利·拉比

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)

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

最新更新