在Django admin中隐藏删除后的对象可以通过重写ModelAdmin类的delete_view方法来实现。具体步骤如下:
from django.contrib import admin
from django.contrib.admin.utils import unquote
from django.contrib.admin.views.main import IS_POPUP_VAR
from django.contrib.admin.options import get_deleted_objects
from django.contrib.admin.utils import model_ngettext
from django.contrib.admin import helpers
from django.contrib.admin.utils import quote
from django.http import HttpResponseRedirect
from django.template.response import TemplateResponse
from django.utils.encoding import force_text
from django.utils.html import format_html
from django.utils.translation import ugettext_lazy as _
class CustomModelAdmin(admin.ModelAdmin):
def delete_view(self, request, object_id, extra_context=None):
"""
The 'delete' admin view for this model.
"""
model = self.model
opts = model._meta
obj = self.get_object(request, unquote(object_id))
if not self.has_delete_permission(request, obj):
raise PermissionDenied
using = router.db_for_write(model)
if request.method == 'POST':
if obj is None:
raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {
'name': force_text(opts.verbose_name),
'key': escape(object_id),
})
# Populate deleted_objects, a data structure of all related objects that
# will also be deleted.
deleted_objects, model_count, perms_needed, protected = get_deleted_objects(
[obj], opts, request.user, self.admin_site, using)
if request.POST.get('post'):
if perms_needed:
raise PermissionDenied(_("You do not have permission to delete this %(name)s.") % {
'name': force_text(opts.verbose_name),
})
obj_display = force_text(obj)
self.log_deletion(request, obj, obj_display)
self.delete_model(request, obj)
return self.response_delete(request, obj_display, obj)
if perms_needed or protected:
title = _("Cannot delete %(name)s") % {"name": force_text(opts.verbose_name)}
else:
title = _("Are you sure?")
context = {
**self.admin_site.each_context(request),
'title': title,
'object_name': force_text(opts.verbose_name),
'object': obj,
'deleted_objects': deleted_objects,
'model_count': dict(model_count).items(),
'perms_lacking': perms_needed,
'protected': protected,
'opts': opts,
'root_path': self.admin_site.root_path,
'app_label': opts.app_label,
'preserved_filters': self.get_preserved_filters(request),
'is_popup': (IS_POPUP_VAR in request.POST or
IS_POPUP_VAR in request.GET),
'obj': obj,
}
# Display the confirmation page
return TemplateResponse(request, self.delete_confirmation_template or [
"admin/%s/%s/delete_confirmation.html" % (opts.app_label, opts.model_name),
"admin/%s/delete_confirmation.html" % opts.app_label,
"admin/delete_confirmation.html"
], context)
context = {
**self.admin_site.each_context(request),
'title': _("Are you sure?"),
'object_name': force_text(opts.verbose_name),
'object': obj,
'opts': opts,
'root_path': self.admin_site.root_path,
'app_label': opts.app_label,
'preserved_filters': self.get_preserved_filters(request),
'is_popup': (IS_POPUP_VAR in request.POST or
IS_POPUP_VAR in request.GET),
'obj': obj,
}
# Display the confirmation page
return TemplateResponse(request, self.delete_confirmation_template or [
"admin/%s/%s/delete_confirmation.html" % (opts.app_label, opts.model_name),
"admin/%s/delete_confirmation.html" % opts.app_label,
"admin/delete_confirmation.html"
], context)
from django.contrib import admin
from .models import YourModel
admin.site.register(YourModel, CustomModelAdmin)
通过以上步骤,你可以在Django admin中隐藏删除后的对象。当你删除一个对象时,它将不再显示在列表中,但仍然存在于数据库中。
领取专属 10元无门槛券
手把手带您无忧上云