用于覆盖模型管理中的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 列表页面中隐藏此消息?
从查询集中删除按预期工作。仅显示失败消息
第二条用户消息由
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
。