多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[Django——Xadmin中的功能](http://blog.csdn.net/lyysr/article/details/48735053) [django使用xadmin的全局配置](http://blog.csdn.net/qingche456/article/details/59106688) [Xadmin文档](http://blog.csdn.net/kingken212/article/details/46992535) Views class xadmin.views.BaseAdminObject 提供给 BaseAdminView 和 BaseAdminPlugin 的通用基类,主要是提供了一些常用的通用方法 get_admin_url(name, *args, **kwargs) 便捷方法,方便的通过 name 取得 url,会加上 AdminSite.app_name 的 url namespace get_form_params(new_params=None, remove=None) 将当前 request 的参数,新加或是删除后,生成 hidden input。用于放入 HTML 的 Form 中。 参数: new_params – 要新加的参数,该参数为 dict remove – 要删除的参数,该参数为 list, tuple get_model_perm(model, name) 获取 Model 的某种权限标签,标签的格式为: >>> view.get_model_perm(User, 'view') >>> 'auth.user_view' get_model_url(model, name, *args, **kwargs) 便捷方法,方便的通过 model, name 取得 url,会自动拼成 urlname,并会加上 AdminSite.app_name 的 url namespace get_model_view(view_class, model, *args, **kwargs) 获取 ModelAdminViewClass 的实例。首先通过 AdminSite 取得 model 对应的 OptionClass,然后调用 get_view() 方法 参数: view_class – ModelAdminViewClass 的类 model – 绑定的 Model 类 get_query_string(new_params=None, remove=None) 在当前的query_string基础上生成新的query_string 参数: new_params – 要新加的参数,该参数为 dict remove – 要删除的参数,该参数为 list, tuple get_view(view_class, option_class=None, *args, **kwargs) 获取 AdminViewClass 的实例。实际上就是调用 get_view_class() 方法 参数: view_class – AdminViewClass 的类 option_class – 希望与 AdminViewClass 合并的 OptionClass has_model_perm(model, name, user=None) 判断当前用户是否有某个 Model 的 某种权限,例如: >>> view.has_model_perm(User, 'view') >>> True render_response(content, response_type='json') 便捷方法,方便生成 HttpResponse,如果 response_type 为 json 会自动转为 json 格式后输出 static(path) xadmin.util.static() 的快捷方法,返回静态文件的 url。 template_response(template, context) 便捷方法,方便生成 TemplateResponse class xadmin.views.BaseAdminPlugin(admin_view) 所有 Plugin 的基类。继承于 BaseAdminObject 。插件的注册和使用可以参看 xadmin.sites.AdminSite.register_plugin() ,插件的原理可以参看 filter_hook() : filter_hook(func) 表明 AdminView 的方法可以被插件插入的装饰器。执行使用了该装饰器的方法时,会按照以下过程执行: 首先将实例的 plugins 属性取出,取出含有同样方法名的插件 按照插件方法的 priority 属性排序 顺序执行插件方法,执行插件方法的规则: 如果插件方法没有参数,AdminView 方法的返回结果不为空则抛出异常 如果插件方法的第一个参数为 __ ,则 AdminView 方法将作为第一个参数传入,注意,这时还未执行该方法,在插件中可以通过 __() 执行,这样就可以实现插件在 AdminView 方法执行前实现一些自己的逻辑,例如: def get_context(self, __): c = {'key': 'value'} c.update(__()) return c 如果插件方法的第一个参数不为 __ ,则执行 AdminView 方法,将结果作为第一个参数传入 最终将插件顺序执行的结果返回 init_request(*args, **kwargs) 插件的初始化方法,Plugin 实例化后被调用的第一个方法。该方法主要用于初始化插件需要的属性,同时判断当前请求是否需要加载该插件,例如 Ajax插件的实现方式: def init_request(self, *args, **kwargs): return bool(self.request.is_ajax() or self.request.REQUEST.get('_ajax')) 当返回值为 False 时,所属的 AdminView 实例不会加载该插件 class xadmin.views.BaseAdminView(request, *args, **kwargs) 所有 AdminView 的基类。继承于 BaseAdminObject 和 django.views.generic.View 该类是 xadmin 中 最核心 的类,所有的 AdminView 都需要继承此类。xadmin 与 Django Admin最大的区别就在于 xadmin 每次请求会产生一个 AdminView 的实例,也就是基于 Class 的 view 方式。该方式在 Django 1.3 被实现,可以参看 Django 的官方文档Class-based generic views 使用 Class 的方式实现的好处显而易见。首先,每一次请求都会产生一个新的实例,这样 request 这种变量就可以保存在实例中,基类的扩展,或是复写父类方法时再也不用带着 request 到处跑了,当然,除了 request 还有很多可以基于实例存储的变量。 其次,基于实例的方式非常方便的实现了插件功能,而且还能实现插件的动态加载,因为每个 AdminView 实例可以根据自身实例的属性情况来判断加载哪些插件,具体信息也可以参看 BaseAdminPlugin 的描述。 实现一个自己的 AdminView 类很简单,举例如下: from xadmin.sites import site from xadmin.views import BaseAdminView class MyAdminView(BaseAdminView): def get(self, request, *args, **kwargs): pass site.register_view(r'^me_test/$', MyAdminView, name='my_test') 而后您就可以在 me_test/ 访问到该view了。当然xadmin同事提供了一些通用的 AdminView,分别为 CommAdminView : xadmin通用界面的基础View,提供了xadmin通用界面需要的一些数据(菜单等) ModelAdminView : 核心类之一,提供了基于 Model 的 AdminView。 classmethod as_view() 复写了 View.as_view() 方法,主要是将 View.dispatch() 的也写到了本方法中,并且去掉了一些初始化操作,因为这些初始化操作在 AdminView 的初始化方法中已经完成了,可以参看 BaseAdminView.init_request() get_context(*args, **kwargs) filter_hook 返回显示页面所需的 context 对象。 get_media(*args, **kwargs) filter_hook 取得页面所需的 Media 对象,用于生成 css 和 js 文件 init_plugin(*args, **kwargs) AdminView 实例中插件的初始化方法,在 BaseAdminView.init_request() 后调用。根据 AdminView 中的 base_plugins 属性将插件逐一初始化,既调用 BaseAdminPlugin.init_request() 方法,并根据返回结果判断是否加载该插件。最后该方法会将初始化后的插件设置为 plugins 属性。 init_request(*args, **kwargs) 一般用于子类复写的初始化方法,在 AdminView 实例化时调用,:class:BaseAdminView 的该方法不做任何操作。 class xadmin.views.CommAdminView(request, *args, **kwargs) 基于 BaseAdminView 提供的通用 AdminView。主要是完成了一些 xadmin 页面通用内容的处理。主要有: 网站标题 全局的 Model 图标 网站菜单 View属性: site_title = None 网站的标题 globe_models_icon = {} 全局的 Model 图标: globe_models_icon = {User: 'user-icon'} get_context(*args, **kwargs) filter_hook Context Params : site_title : 使用 site_title 属性,默认为 “Django Xadmin” nav_menu : 权限过滤后的系统菜单项,如果在非 DEBUG 模式,该项会缓存在 SESSION 中 get_model_icon(*args, **kwargs) filter_hook 取得 Model 图标,Model 图标会作为 css class,一般生成 HTML 如下: <i class="icon-model icon-{{model_icon}}"></i> 这是 Bootstrap 标准的图标格式,xadmin 目前是用了 Font Icon (Font-Awesome),您可以制作自己的图标,具体信息可以参考如何制作自己的字体图标 注解 Model 图标,目前被使用在以下几个地方,当然您也可以随时使用在自己实现的页面中: 系统菜单 列表页面标题中 添加、修改及删除页面的标题中 FAQ: 如果定义 Model 图标 您可以在 CommAdminView 的 OptionClass 中通过 CommAdminView.globe_models_icon 属性设定全局的 Model 图标。或者在 Model 的 OptionClass 中设置 model_icon 属性。 get_nav_menu(*args, **kwargs) filter_hook 返回网站菜单,如果 get_site_menu() 返回的结果不是 None ,那么将把其返回结果作为菜单的第一部分,而后会补全没有出现的 Model 列表页菜单项,如果 get_site_menu() 返回为 None, 那么将自动根据 App 和 Model 生成两级的菜单。 返回类型: 格式见 get_site_menu() 返回格式 get_site_menu() FAQ:如何定制系统菜单 用于给子类复写的方法,开发者可以在子类或 OptionClass 中复写该方法,返回自己定义的网站菜单。菜单的格式为: ({ "title": "菜单标题", "perm": "权限标示", "icon": "图标的 css class", "url": "菜单url", "menus": [...] # 子菜单项 }) 菜单项的 perm 和 url 如果是基于 Model 的,可以使用 xadmin 提供的便利方法 BaseAdminObject.get_model_perm() 和 :meth:`BaseAdminObject.get_model_url`。举例说明创建菜单: class AdminSettings(object): def get_site_menu(self): return ( {'title': '内容管理', 'perm': self.get_model_perm(Article, 'change'), 'menus':( {'title': '游戏资料', 'icon': 'info-sign', 'url': self.get_model_url(Article, 'changelist') + '?_rel_categories__id__exact=2'}, {'title': '网站文章', 'icon': 'file', 'url': self.get_model_url(Article, 'changelist') + '?_rel_categories__id__exact=1'}, )}, {'title': '分类管理', 'perm': self.get_model_perm(Category, 'change'), 'menus':( {'title': '主要分类', 'url': self.get_model_url(Category, 'changelist') + '?_p_parent__isnull=True'}, {'title': '游戏资料', 'url': self.get_model_url(Category, 'changelist') + '?_rel_parent__id__exact=2'}, )}, ) site.register(CommAdminView, AdminSettings) message_user(*args, **kwargs) filter_hook 向用户显示一个消息,这个消息会在页面生成的时候生成以下 HTML: {% for message in messages %} <div class="alert{% if message.tags %} alert-{{ message.tags }}{% endif %}"> <a class="close" data-dismiss="alert" href="#">&times;</a> {{ message }} </div> {% endfor %} 这是标准的 Bootstrap 格式。xadmin默认使用 django.contrib.messages 实现消息系统 参数: message – 消息内容 level – 消息等级,默认为 info class xadmin.views.ModelAdminView(request, *args, **kwargs) 基于 Model 的 AdminView,该类的子类,在 AdminSite 生成 urls 时,会为每一个注册的 Model 生成一个 url 映射。ModelAdminView 注册时使用 xadmin.sites.AdminSite.register_modelview() 方法注册,具体使用实例可以参见该方法的说明,或参考实例: from xadmin.views import ModelAdminView class TestModelAdminView(ModelAdminView): def get(self, request, obj_id): pass site.register_modelview(r'^(.+)/test/$', TestModelAdminView, name='%s_%s_test') 注册后,用户可以通过访问 /%(app_label)s/%(module_name)s/123/test 访问到该view Option 属性 fields = None (list,tuple) 默认显示的字段 exclude = None (list,tuple) 排除的字段,主要用在编辑页面 ordering = None (dict) 获取 Model 的 queryset 时默认的排序规则 model = None 绑定的 Model 类,在注册 Model 时,该项会自动附在 OptionClass 中,见方法 AdminSite.register() 实例属性 opts 即 Model._meta app_label 即 Model._meta.app_label module_name 即 Model._meta.module_name model_info 即 (self.app_label, self.module_name) get_context(*args, **kwargs) filter_hook Context Params : opts : Model 的 _meta app_label : Model 的 app_label module_name : Model 的 module_name verbose_name : Model 的 verbose_name get_model_perms() 返回包含 Model 所有权限的 dict。dict 的 key 值为: add view change delete , value 为 boolean 值,表示当前用户是否具有相应的权限。 get_object(*args, **kwargs) filter_hook 根据 object_id 获得唯一的 Model 实例,如果 pk 为 object_id 的 Model 不存在,则返回 None get_ordering() 返回 Model 列表的 ordering, 默认就是返回 ModelAdminView.ordering ,子类可以复写该方法 get_template_list(template_name) 根据 template_name 返回一个 templates 列表,生成页面是在这些列表中寻找存在的模板。这样,您就能方便的复写某些模板。列表的格式为: "xadmin/%s/%s/%s" % (opts.app_label, opts.object_name.lower(), template_name), "xadmin/%s/%s" % (opts.app_label, template_name), "xadmin/%s" % template_name, has_add_permission() 返回当前用户是否有添加权限 has_change_permission(obj=None) 返回当前用户是否有修改权限 has_delete_permission(obj=None) 返回当前用户是否有删除权限 has_view_permission(obj=None) 返回当前用户是否有查看权限 注解 目前的实现为:如果一个用户有对数据的修改权限,那么他就有对数据的查看权限。当然您可以在子类中修改这一规则 model_admin_url(name, *args, **kwargs) 等同于 BaseAdminObject.get_admin_url() ,只是无需填写 model 参数, 使用本身的 ModelAdminView.model 属性。 queryset() 返回 Model 的 queryset。可以使用该属性查询 Model 数据。 class xadmin.views.ListAdminView(request, *args, **kwargs) 显示数据列表的 AdminView, 该 View 实现了基本的数据排序和分页等功能. Option 属性 list_display = ('__str__',) 默认显示列 list_display_links = () 显示修改或查看数据详情连接的列 list_select_related = False 是否提前加载关联数据, 使用 select_related list_per_page = 50 每页显示数据的条数 list_max_show_all = 200 每页最大显示数据的条数 list_exclude = () 排除显示的列, 在显示列的设置中不会出现这些被排除的列 search_fields = () 按照这些列搜索数据 ordering = None 默认的数据排序 object_list_template = None 显示数据的模板 get(*args, **kwargs) filter_hook 显示 Model 列表. get_check_field_url(f) 返回 显示列 菜单项中每一项的 url. get_context(*args, **kwargs) filter_hook Context Params : model_fields : 用于 选择显示列 功能, 保存所有可显示的列信息 result_headers : 显示列表的头部信息, 是 ResultHeader 列表 results : 显示列表的内容信息, 是 ResultItem 列表 get_list_display(*args, **kwargs) filter_hook 获得列表显示的列. 如果 request 中有 _cols 参数, 则使用该参数, 否则使用 list_display. 注解 该方法会赋值 base_list_display 属性, 保存 list_display. 如果有插件修改了该方法的返回值(例如: Action 插件), 可能会增加其他列. 但是这些列可能对其他插件没有意义(例如: 导出数据插件). 那么其他插件可以使用base_list_display 这个属性, 取得最原始的显示列. get_list_display_links(*args, **kwargs) filter_hook 返回一组列, 这些列的数据会以链接形式显示, 连接地址可能是数据修改页面(如果有修改权限), 或是查看页面. 默认情况下会使用 list_display_links , 如果 list_display_links 为空, 则返回 list_display 第一列. get_list_queryset(*args, **kwargs) filter_hook 取得 Model 的 queryset, 该 queryset 已经进行排序和过滤过. 其他插件可以在这里修改 queryset get_media(*args, **kwargs) filter_hook 返回列表页面的 Media, 该页面添加了 xadmin.page.list.js 文件 get_model_method_fields() 将所有 OptionClass 中含有 is_column=True 的方法, 使用 FakeMethodField 包装成一个假的 DB Field. 用于在选择显示列的功能中显示. get_ordering(*args, **kwargs) filter_hook Returns the list of ordering fields for the change list.First we check the get_ordering() method in model admin, then we checkthe object’s default ordering. Then, any manually-specified orderingfrom the query string overrides anything. Finally, a deterministicorder is guaranteed by ensuring the primary key is used as the lastordering field. get_ordering_field(*args, **kwargs) filter_hook 根据参数 field_name 获取需要排序 Field 的名字. field_name 可能是 Model 的一个标准 DB Field, 也有可能是可执行方法, 或是 OptionClass 及 Model 的一个属性, 这种情况下会取其 admin_order_field 属性作为排序字段, 如果取不到, 则返回 None. 例如: class UserAdmin(object): def my_field(self, obj): return obj.name.lower() my_field.admin_order_field = 'name' get_ordering_field_columns(*args, **kwargs) filter_hook Returns a SortedDict of ordering field column numbers and asc/desc get_page_number(*args, **kwargs) filter_hook 返回翻页组件各页码显示的 HTML 内容. 默认使用 bootstrap 样式 参数: i – 页码, 可能是 DOT get_paginator(*args, **kwargs) filter_hook 返回 paginator 实例, 使用 paginator_class 类实例化 get_response(*args, **kwargs) filter_hook 在 get_context() 之后执行. 该方法默认无返回内容, 插件可以复写该方法, 返回指定的 HttpResponse. get_result_list(*args, **kwargs) filter_hook init_request(*args, **kwargs) 初始化请求, 首先判断当前用户有无 view 权限, 而后进行一些生成数据列表所需的变量的初始化操作. make_result_list() 该方法负责生成数据列表及分页信息. 数据列表会赋值给属性 result_list , 插件可以在该方法后执行一些数据处理. post(*args, **kwargs) filter_hook 显示 Model 列表的 POST 请求, 默认跟 GET 请求返回同样的结果, 插件可以通过复写 post_response() 方法改变 POST 请求的返回 post_response(*args, **kwargs) filter_hook 列表的 POST 请求, 该方法默认无返回内容, 插件可以复写该方法, 返回指定的 HttpResponse. post_result_list(*args, **kwargs) filter_hook result_header(*args, **kwargs) filter_hook 返回某一列的头信息, 一个 ResultHeader 实例. 参数: field_name – 列的名字 row – ResultHeader 实例 result_headers(*args, **kwargs) filter_hook 返回列表的列头信息. 返回一个 ResultRow 实例, 其 cells 属性包含列信息 result_item(*args, **kwargs) filter_hook 返回某一对象某一列的数据, ResultItem 实例. 参数: obj – Model 对象 field_name – 列的名字 row – ResultHeader 实例 result_row(*args, **kwargs) filter_hook 返回列表某一行的内容信息. 返回一个 ResultRow 实例, 其 cells 属性包含各列内容信息 参数: obj – Model 对象 results(*args, **kwargs) filter_hook 返回整个列表内容信息. 返回一个 ResultRow 的数据, 包含各行信息 url_for_result(*args, **kwargs) filter_hook 返回列表内容连接. 如果当前用户有修改权限就返回修改页面的连接, 否则返回查看详情页面连接 参数: result – Model 对象 class xadmin.views.ModelFormAdminView(request, *args, **kwargs) 用于添加或修改数据的 AdminView,该类是一个基类,提供了数据表单显示及修改等通用功能,被 CreateAdminView 及 UpdateAdminView 继承 Option 属性 form = <class 'django.forms.models.ModelForm'> 使用 Model 生成 Form 的基本 Form 类,默认为 django.forms.ModelForm formfield_overrides = {} 可以指定某种类型的 DB Field,使用指定的 Form Field 属性,例如: class AtricleAdmin(object): formfield_overrides = { models.FileField:{'widget': mywidgets.XFileWidget}, } 这样,显示所有 FileField 字段时,都会使用 mywidgets.XFileWidget 来显示 readonly_fields = () 只读的字段,这些字段不能被编辑 style_fields = {} 指定 Field 的 Style, Style一般用来实现同一种类型的字段的不同效果,例如同样是 radio button,有普通及``inline``两种 Style。通常 xadmin 针对表单的插件会实现更多的 Field Style。您使用这些插件后,只要方便的将想要使用插件效果的字段设置成插件实现的 Style 即可,例如: class AtricleAdmin(object): style_fields = {"content": "rich-textarea"} rich-textarea 可能是某插件提供的 Style,这样显示 content 字段时就会使用该插件的效果了 relfield_style = None 当 Model 是其他 Model 的 ref model 时,其他 Model 在显示本 Model 的字段时使用的 Field Style save_as = False 是否显示 另存为 按钮 save_on_top = False 是否在页面上面显示按钮组 add_form_template = None 添加页面的模板 change_form_template = None 修改页面的模板 form_layout = None 页面 Form 的 Layout 对象,是一个标准的 Crispy Form Layout 对象。使用 Layout 可以方便的定义整个 Form 页面的结构。有关 Crispy Form 可以参考其文档 Crispy Form 文档设置 form_layout 的示例: from xadmin.layout import Main, Side, Fieldset, Row, AppendedText class AtricleAdmin(object): form_layout = ( Main( Fieldset('Comm data', 'title', 'category' ), Inline(Log), Fieldset('Details', 'short_title', Row(AppendedText('file_size', 'MB'), 'author'), 'content' ), ), Side( Fieldset('Status', 'status', ), ) ) 有关 Layout 中元素的信息,可以参看文档 form_layout formfield_for_dbfield(*args, **kwargs) filter_hook 生成表单时的回调方法,返回 Form Field。 参数: db_field – Model 的 DB Field get(*args, **kwargs) filter_hook 显示表单。具体的程序执行流程为: prepare_form() instance_forms() 2.1 get_form_datas() setup_forms() get_response() get_context(*args, **kwargs) filter_hook Context Params: form : Form 对象 original : 要修改的原始数据对象 show_delete : 是否显示删除项 add : 是否是添加数据 change : 是否是修改数据 errors : Form 错误信息 get_error_list(*args, **kwargs) filter_hook 获取表单的错误信息列表。 get_field_attrs(*args, **kwargs) filter_hook 根据 DB Field 返回 Form Field 的属性,dict类型。 参数: db_field – Model 的 DB Field get_field_style(*args, **kwargs) filter_hook 根据 Field Style 返回 Form Field 属性。扩展插件可以过滤该方法,提供各种不同的 Style 参数: db_field – Model 的 DB Field style – 配置的 Field Style,该值来自于属性 style_fields get_form_helper(*args, **kwargs) filter_hook 取得 Crispy Form 需要的 FormHelper。具体信息可以参看 Crispy Form 文档 get_form_layout(*args, **kwargs) filter_hook 返回 Form Layout ,如果您设置了 form_layout 属性,则使用该属性,否则该方法会自动生成 Form Layout 。有关 Form Layout 的更多信息可以参看 Crispy Form 文档设置 Form Layout 可以非常灵活的显示表单页面的各个元素 get_media(*args, **kwargs) filter_hook get_model_form(*args, **kwargs) filter_hook 根据 Model 返回 Form 类,用来显示表单。 get_readonly_fields(*args, **kwargs) filter_hook 返回只读字段,子类或 OptionClass 可以复写该方法 instance_forms(*args, **kwargs) filter_hook 实例化 Form 对象,即使用 get_form_datas() 返回的值初始化 Form,实例化的 Form 对象赋值为 form_obj 属性 post(*args, **kwargs) filter_hook 保存表单数据。具体的程序执行流程为: prepare_form() instance_forms() 2.1 get_form_datas() setup_forms() valid_forms() 4.1 save_forms() 4.2 save_models() 4.3 save_related() 4.4 post_response() prepare_form(*args, **kwargs) filter_hook 准备 Form,即调用 get_model_form() 获取 form ,然后赋值给 model_form 属性 save_forms(*args, **kwargs) filter_hook 保存表单,赋值为 new_obj 属性,这时该对象还没有保存到数据库中,也没有 pk 生成 save_models(*args, **kwargs) filter_hook 保存数据到数据库中 save_related(*args, **kwargs) filter_hook 保存关联数据 setup_forms() 配置 Form。主要是 valid_forms(*args, **kwargs) filter_hook 验证 Form 的数据合法性 class xadmin.views.CreateAdminView(request, *args, **kwargs) 创建数据的 ModeAdminView 继承自 ModelFormAdminView ,用于创建数据。 get_context(*args, **kwargs) filter_hook Context Params: title : 表单标题 get_form_datas(*args, **kwargs) filter_hook 从 Request 中返回 Form 的初始化数据 get_response(*args, **kwargs) filter_hook 返回显示表单页面的 Response ,子类或是 OptionClass 可以复写该方法 post_response(*args, **kwargs) filter_hook 当成功保存数据后,会调用该方法返回 HttpResponse 或跳转地址 class xadmin.views.UpdateAdminView(request, *args, **kwargs) 修改数据的 ModeAdminView 继承自 ModelFormAdminView ,用于修改数据。 get_context(*args, **kwargs) filter_hook Context Params: title : 表单标题 object_id : 修改的数据对象的 id get_form_datas(*args, **kwargs) filter_hook 获取 Form 数据 get_response(*args, **kwargs) filter_hook post_response(*args, **kwargs) filter_hook 当成功修改数据后,会调用该方法返回 HttpResponse 或跳转地址 class xadmin.views.DeleteAdminView(request, *args, **kwargs) 删除 Model 的 AdminView。主要用于删除数据 Option属性 delete_confirmation_template = None 删除时确认删除页面的模板名称 实例属性 obj 即将被删除的对象 delete_model(*args, **kwargs) filter_hook 删除 self.obj get(*args, **kwargs) filter_hook get_context(*args, **kwargs) filter_hook Context Params: title : 确认删除的标题,如果您没有权限删除的话,会提示无法删除 object : 要被删除的对象 deleted_objects : 关联被删除的所有数据对象 perms_lacking : 缺少的权限 protected : 被保护的数据,无法被删除的数据对象 init_request(object_id, *args, **kwargs) 初始化操作。根据传入的 object_id 取得要被删除的数据对象,而后进行权限判断 post(*args, **kwargs) filter_hook post_response(*args, **kwargs) filter_hook 删除成功后的操作。首先提示用户信息,而后根据用户权限做跳转,如果用户有列表产看权限就跳转到列表页面,否则跳到网站首页。 class xadmin.views.DetailAdminView(request, *args, **kwargs) 显示 Model 详细信息的 AdminView. 该 View 页面只能用来查看数据内容, 不能用来修改数据.该 View 显示各字段的布局跟 xadmin.views.edit.ModelFormAdminView 一致. Option属性 detail_layout = None 详情页面的 Layout 对象,是一个标准的 Crispy Form Layout 对象。使用 Layout 可以方便的定义整个页面的结构。 detail_show_all = True 是否显示所有字段的内容, 默认为 True . 如果为 True 则会显示 Layout 中没有列出的字段, 否则会隐藏这些字段 detail_template = None 详情页面的模板文件 实例属性 obj 即将被删除的对象 get(*args, **kwargs) filter_hook get_context(*args, **kwargs) filter_hook Context Params : form : 用于显示数据的 Form 对象 object : 要显示的 Model 对象 get_field_result(*args, **kwargs) filter_hook 返回包含该字段内容的 ResultField 实例. get_form_helper(*args, **kwargs) filter_hook 取得 Crispy Form 需要的 FormHelper。具体信息可以参看 Crispy Form 文档 get_form_layout(*args, **kwargs) filter_hook 返回 Form Layout ,如果您设置了 detail_layout 属性,则使用 form_layout 属性,如果都没有该方法会自动生成 Form Layout 。有关 Form Layout 的更多信息可以参看 Crispy Form 文档设置 Form Layout 可以非常灵活的显示页面的各个元素 get_media(*args, **kwargs) filter_hook 返回列表页面的 Media, 该页面添加了 form.css 文件 get_model_form(*args, **kwargs) filter_hook 根据 Model 返回 Form 类,用来显示表单。 get_response(*args, **kwargs) filter_hook 返回 HttpResponse , 插件可以复写该方法返回特定的 HttpResponse init_request(object_id, *args, **kwargs) 初始化操作。根据传入的 object_id 取得要被显示的数据对象,而后进行权限判断, 如果没有数据查看权限会显示禁止页面.