如何从 Django DeleteView 发送错误消息?
How to send error message from Django DeleteView?
假设有两个模型 Parent
和 Child
。 Parent
到 child
是一对多关系。
我正在为父模型创建 DeleteView。在删除之前我需要检查 Parent
是否有 Children
。如果没有 Children
,那么 Parent
模型将照常删除。但是如果有 Children
那么我需要发送错误消息到 DeleteView 确认页面。
如何使用 DeleteView 实现此目的?
您可以覆盖 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)
DeleteView继承DeletionMixin. What you can do is add on_delete=PROTECTED
in your child model and override the delete method in your view to catch a ProtectedError
exception. For the error message, see Django's 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)
假设有两个模型 Parent
和 Child
。 Parent
到 child
是一对多关系。
我正在为父模型创建 DeleteView。在删除之前我需要检查 Parent
是否有 Children
。如果没有 Children
,那么 Parent
模型将照常删除。但是如果有 Children
那么我需要发送错误消息到 DeleteView 确认页面。
如何使用 DeleteView 实现此目的?
您可以覆盖 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)
DeleteView继承DeletionMixin. What you can do is add on_delete=PROTECTED
in your child model and override the delete method in your view to catch a ProtectedError
exception. For the error message, see Django's 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)