Django 1.11
我正在制作照片档案。通过AJAX我向帧添加一些信息(评论,注释,地点等)。
但现在我想组织删除框架。
这似乎是我设法找到的相关问题:Handle PROTECT ERROR in Django DeleteView
我需要告知用户:你正试图从其他物体的脚下割草。
Berislav Lopac在上述链接上的回答似乎是合理的。
现在在生产服务器上我得到了这个:
你能帮我理解如何在生产中向用户展示有意义的信息吗?只需捕获ProtectedError消息并显示它而不是服务器错误(500)。
模型
class Frame(models.Model):
type = models.CharField(max_length=10,
blank=False,
null=False,
default="---",
verbose_name=_('type'))
class FramePlace(CommonUrlMethodsMixin,
models.Model
):
frame = models.ForeignKey(Frame,
blank=False,
on_delete=models.PROTECT,
verbose_name=_("frame"))
place = models.ForeignKey(Place,
blank=False,
on_delete=models.PROTECT,
verbose_name=_("place"))
答案 0 :(得分:4)
有两种方法可以实现这个目标
perform_destroy
或destroy
方法class MyViewSet(viewsets.ModelViewSet):
def perform_destroy(self, instance):
try:
return super(MyViewSet, self).perform_destroy(instance)
except ProtectedError as exception:
data = {
'code': 'server_error',
'message': _('Internal server error.'),
'error': {
'type': str(type(exception)),
'message': str(exception)
}
}
return JsonResponse(data=data, status=status.HTTP_400_BAD_REQUEST)
<强> middleware.py 强>
class ExceptionMiddleware(object):
"""
Middleware that makes sure clients see a meaningful error message wrapped in a Json response.
"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
return response
def process_exception(self, request, exception):
data = {
'code': 'server_error',
'message': _('Internal server error.'),
'error': {
'type': str(type(exception)),
'message': str(exception)
}
}
return JsonResponse(data=data, status=status.HTTP_400_BAD_REQUEST)
<强> settings.py 强>
MIDDLEWARE = [
...
'myapp.middleware.ExceptionMiddleware'
]
答案 1 :(得分:0)
针对此问题。我正在使用下面的代码。希望这会有所帮助。
在这里,捕获下面的ProtectedError
代码是有效的。
from django.db.models import ProtectedError
def delete(self, request):
obj = self.get_object()
try:
obj.delete()
return JsonResponse( {"error":""} )
except ProtectedError as e:
return JsonResponse( {"error":"somae relation exists"} )
except Exception as e:
return JsonResponse( {"error":"something went wrong"} )
希望这对您有用。