Source code for xadmin.views.delete

from django.core.exceptions import PermissionDenied
from django.db import transaction, router
from django.http import Http404, HttpResponseRedirect
from django.template.response import TemplateResponse
from django import VERSION as django_version
from django.utils import six
from django.utils.encoding import force_text
from django.utils.html import escape
from django.utils.translation import ugettext as _
from django.contrib.admin.utils import get_deleted_objects

from xadmin.util import unquote
from xadmin.views.edit import UpdateAdminView
from xadmin.views.detail import DetailAdminView
from xadmin.views.base import ModelAdminView, filter_hook, csrf_protect_m


[docs]class DeleteAdminView(ModelAdminView): """ 删除 Model 的 AdminView。主要用于删除数据 **Option属性** .. autoattribute:: delete_confirmation_template **实例属性** .. attribute:: obj 即将被删除的对象 """ #: 删除时确认删除页面的模板名称 delete_confirmation_template = None def __init__(self, request, *args, **kwargs): if django_version > (2, 0): for model in self.admin_site._registry: if not hasattr(self.admin_site._registry[model], 'has_delete_permission'): setattr(self.admin_site._registry[model], 'has_delete_permission', self.has_delete_permission) super(DeleteAdminView, self).__init__(request, *args, **kwargs)
[docs] def init_request(self, object_id, *args, **kwargs): """ 初始化操作。根据传入的 ``object_id`` 取得要被删除的数据对象,而后进行权限判断 """ self.obj = self.get_object(unquote(object_id)) if not self.has_delete_permission(self.obj): raise PermissionDenied if self.obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % { 'name': force_text(self.opts.verbose_name), 'key': escape(object_id)}) using = router.db_for_write(self.model) # 取得所用db # 生成 deleted_objects, 存有所有即将被删除的关联数据 if django_version > (2, 1): (self.deleted_objects, model_count, self.perms_needed, self.protected) = get_deleted_objects( [self.obj], self.opts, self.admin_site) else: (self.deleted_objects, model_count, self.perms_needed, self.protected) = get_deleted_objects( [self.obj], self.opts, self.request.user, self.admin_site, using)
[docs] @csrf_protect_m @filter_hook def get(self, request, object_id): context = self.get_context() return TemplateResponse(request, self.delete_confirmation_template or self.get_template_list("views/model_delete_confirm.html"), context)
[docs] @csrf_protect_m @transaction.atomic @filter_hook def post(self, request, object_id): if self.perms_needed: raise PermissionDenied self.delete_model() response = self.post_response() cls_str = str if six.PY3 else basestring if isinstance(response, cls_str): # 如果返回字符串,说明是一个url,跳转到该页面 response = HttpResponseRedirect(response) return response
[docs] @filter_hook def delete_model(self): """ Given a model instance delete it from the database. 删除 ``self.obj`` """ self.log('delete', '', self.obj) self.obj.delete()
[docs] @filter_hook def get_context(self): """ **Context Params**: ``title`` : 确认删除的标题,如果您没有权限删除的话,会提示无法删除 ``object`` : 要被删除的对象 ``deleted_objects`` : 关联被删除的所有数据对象 ``perms_lacking`` : 缺少的权限 ``protected`` : 被保护的数据,无法被删除的数据对象 """ if self.perms_needed or self.protected: title = _("Cannot delete %(name)s") % {"name": force_text(self.opts.verbose_name)} else: title = _("Are you sure?") new_context = { "title": title, "object": self.obj, "deleted_objects": self.deleted_objects, "perms_lacking": self.perms_needed, "protected": self.protected, } context = super(DeleteAdminView, self).get_context() context.update(new_context) return context
[docs] @filter_hook def get_breadcrumb(self): bcs = super(DeleteAdminView, self).get_breadcrumb() bcs.append({ 'title': force_text(self.obj), 'url': self.get_object_url(self.obj) }) item = {'title': _('Delete')} if self.has_delete_permission(): item['url'] = self.model_admin_url('delete', self.obj.pk) bcs.append(item) return bcs
[docs] @filter_hook def post_response(self): """ 删除成功后的操作。首先提示用户信息,而后根据用户权限做跳转,如果用户有列表产看权限就跳转到列表页面,否则跳到网站首页。 """ self.message_user(_('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_text(self.opts.verbose_name), 'obj': force_text(self.obj)}, 'success') if not self.has_view_permission(): return self.get_admin_url('index') return self.model_admin_url('changelist')