【问题标题】:How to send error message from Django DeleteView?如何从 Django DeleteView 发送错误消息?
【发布时间】:2019-06-25 07:08:41
【问题描述】:
假设有两个模型Parent 和Child。 Parent 到 child 是一对多的关系。
我正在为父模型创建 DeleteView。在删除之前我需要检查Parent 是否有Children。如果没有Children,那么Parent 模型将照常删除。但是如果有Children那么我需要发送错误信息到DeleteView确认页面。
如何使用 DeleteView 实现这一点?
【问题讨论】:
标签:
django
django-views
django-class-based-views
【解决方案1】:
DeleteView 继承 DeletionMixin。您可以做的是在您的子模型中添加 on_delete=PROTECTED 并覆盖视图中的 delete 方法以捕获 ProtectedError 异常。错误信息见 Django 的message framework。
models.py:
class Child():
#...
myParent = models.ForeignKey(Parent, on_delete=PROTECTED)
views.py:
from django.db.models import ProtectedError
#...
class ParentDelete(DeleteView):
#...
def delete(self, request, *args, **kwargs):
"""
Call the delete() method on the fetched object and then redirect to the
success URL. If the object is protected, send an error message.
"""
self.object = self.get_object()
success_url = self.get_success_url()
try:
self.object.delete()
except ProtectedError:
messages.add_message(request, messages.ERROR, 'Can not delete: this parent has a child!')
return # The url of the delete view (or whatever you want)
return HttpResponseRedirect(success_url)
【解决方案2】:
您可以覆盖delete 方法并使用Django's message framework 设置消息
from django.contrib import messages
class DeletePArent(DeleteView):
# ...
def delete(self, request, *args, **args):
object = self.get_object()
if object.chidlren.count() > 0:
messages.add_message(request, messages.ERROR, "Can't be deleted, has childern")
return redirect('url-of-your-choice')
return super().delete(request, *args, **kwargs)