Django 4.2 如何在 modeladmin 页面显示删除对象失败?

问题描述 投票:0回答:1

用于覆盖模型管理中的delete_queryset的代码:

    def get_actions(self, request):
        actions = super().get_actions(request)        
        del actions['delete_selected']
        return actions

   def really_delete_selected(self, request, queryset):
        '''
        # 1. Update the group-mailbox relation: `goto` values if mailbox(es) are deleted
        # 2. Sending a mail to the current user with CSV of mailboxes deleted
        # 3. Used domain space will reduce by the maxquota of mailbox
        '''
        response = None
        print('delete from mailbox queryset called')
        try:
            mbox_list = []
            failed_deletions = []
            print(queryset)
            for obj in queryset:
                mdomain = None
                # COMPLETE MAILBOX DELETION OF FOLDERS, DOVECOT ENTRY, ADMIN PANEL PERMANENTLY 
                api_delete_status = call_purge_mailbox_api(request,obj)
                response = api_delete_status
                print('response---------',response, response['status_code'])                
                if response['status_code'] == 200:
                    # Set the quota value after deletion of mailbox(es)
                    mdomain = Domain.objects.get(id=obj.domain.pk)
                    mdomain.quota -= obj.maxquota
                    mdomain.save()
                    mbox_list.append(obj.email) 
                    # Remove the user from the group mailing lists
                    # master_grp_list = GroupMailIds.objects.exclude(goto=None)
                    removed_from_groups :bool = remove_from_group_lists(obj.email,mbox_list)
                    print('mailbox deletion completed.....')
                    # TODO: List for sending a mail to the currently logged in user with CSV of
                    # mailboxes deleted
                else:
                    print('Failed to delete mailbox:', obj.email)
                    failed_deletions.append(obj.email)
 
            print(failed_deletions, len(failed_deletions))

            if mbox_list:  # Check if any mailboxes were successfully deleted
                self.message_user(request, f"Successfully deleted {len(mbox_list)} mailbox(es).",level='success')
            for email in failed_deletions:  # Display error message for each failed deletion
                self.message_user(request, f"Failed to delete {email}. Mailbox absent. Contact helpdesk.",level='error')
            if not mbox_list and not failed_deletions:  # Check if no deletions were attempted
                self.message_user(request, "No mailboxes were selected for deletion.",level='error')
                #return messages.error(request, "No mailboxes were selected for deletion.")
        except Exception as e:
            print(e)
            self.message_user(request, f"Failed to delete items: {str(e)}", level='error')
    really_delete_selected.short_description = "Delete selected entries"




def delete_model(self, request, obj):
        try:
            # Perform the deletion
            api_delete_status = call_purge_mailbox_api(request,obj)
            print('8888888')
            response = api_delete_status
            print('response---------',response, response['status_code'])
            if response['status_code'] == 200:
                obj.delete()
                self.message_user(request, f"Successfully deleted {obj}.", level='success')
                return HttpResponseRedirect(request.path)
            else:
                self.message_user(request, f"Failed to delete mailbox {obj}. Contact Helpdesk", level='error')    
        except Exception as e:
            # Handle deletion failure
            self.message_user(request, f"Failed to delete {obj}. Error: {str(e)}", level='error')
        return HttpResponseRedirect(reverse('admin:%s_%s_changelist' % (obj._meta.app_label, obj._meta.model_name)))

删除失败时,此代码对于删除查询集正确显示。但是当我们在confirm_delete(confirm_delete.html)之后在模型管理页面中删除邮箱对象时,返回列表页面后显示的消息是:

无法删除邮箱[电子邮件受保护]。联系服务台

以及

邮箱“[email protected]”已成功删除。

失败是意料之中的结果。但是为什么django也显示删除成功呢?如何在失败案例的 modeladmin 列表页面中隐藏此消息?

从查询集中删除按预期工作。仅显示失败消息

python django
1个回答
0
投票

第二条用户消息由

ModelAdmin.response_delete
创建,在
ModelAdmin._delete_view
方法运行后在
delete_model
中调用:

class ModelAdmin(BaseModelAdmin):

    def _delete_view(self, request, object_id, extra_context):
        ...
        if request.POST and not protected:  # The user has confirmed the deletion.
            if perms_needed:
                raise PermissionDenied
            obj_display = str(obj)
            attr = str(to_field) if to_field else self.opts.pk.attname
            obj_id = obj.serializable_value(attr)
            self.log_deletion(request, obj, obj_display)
            self.delete_model(request, obj)  # <--- first user message is created here

            return self.response_delete(request, obj_display, obj_id)  # <--- second message is created here
        ...

    def response_delete(self, request, obj_display, obj_id):
        ...
        self.message_user(
            request,
            _("The %(name)s “%(obj)s” was deleted successfully.")
            % {
                "name": self.opts.verbose_name,
                "obj": obj_display,
            },
            messages.SUCCESS,
        )
        ...

另请注意,您在

delete_model
中返回的重定向响应在此处将被忽略。重要的是只有
response_delete
返回的响应。

如果您从更改列表中删除,您不会看到第二条消息,因为该删除是由

delete_selected
操作管理的 - 而不是 ModelAdmins 内的
delete_view

© www.soinside.com 2019 - 2024. All rights reserved.