Source code for xadmin.views.delete

# coding=utf-8
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.utils.encoding import force_unicode
from django.utils.html import escape
from django.utils.translation import ugettext as _
from xadmin.util import unquote, get_deleted_objects

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
[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_unicode(self.opts.verbose_name), 'key': escape(object_id)}) using = router.db_for_write(self.model) # 取得所用db # 生成 deleted_objects, 存有所有即将被删除的关联数据 (self.deleted_objects, self.perms_needed, self.protected) = get_deleted_objects( [self.obj], self.opts, self.request.user, self.admin_site, using)
@csrf_protect_m @filter_hook
[docs] 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, current_app=self.admin_site.name)
@csrf_protect_m @transaction.commit_on_success @filter_hook
[docs] def post(self, request, object_id): if self.perms_needed: raise PermissionDenied self.delete_model() response = self.post_response() if isinstance(response, basestring): # 如果返回字符串,说明是一个url,跳转到该页面 return HttpResponseRedirect(response) else: return response
@filter_hook
[docs] def delete_model(self): """ 删除 ``self.obj`` """ self.obj.delete()
@filter_hook
[docs] 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_unicode(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
@filter_hook
[docs] def get_breadcrumb(self): bcs = super(DeleteAdminView, self).get_breadcrumb() bcs.append({ 'title': force_unicode(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
@filter_hook
[docs] def post_response(self): """ 删除成功后的操作。首先提示用户信息,而后根据用户权限做跳转,如果用户有列表产看权限就跳转到列表页面,否则跳到网站首页。 """ self.message_user(_('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(self.opts.verbose_name), 'obj': force_unicode(self.obj)}, 'success') if not self.has_view_permission(): return self.get_admin_url('index') return self.model_admin_url('changelist')