【问题标题】: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)  
      

      【讨论】:

        猜你喜欢
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2020-05-13
        • 1970-01-01
        • 2021-07-18
        相关资源
        最近更新 更多