插件原理:

  Xadmin中每个页面都是一个AdminView对象返回的HTTPResponse结果。

  Xdamin插件所做的事情就是其实就是在AdminView执行过程中改变其执行逻辑或是改变其返回的结果,起到改变或者增强原有功能的效果

插件运行过程:

  1、自定义插件 需继承 BaseAdminPlugin

    class MyPlugin(BaseAdminPlugin):

      pass

  2、开发好的的插件 首先要注册到xadmin中

    from xadmin.sites import site

    site.register_plugin(MyPlugin,ListAdminView)

    具体注册到哪个AdminView根据自己的需要选择,这里ListAdminView是列表页面

  3、将插件注册到xadmin后,Xadmin在创建AdminView实例的时候,会将该插件放入实例的plugins属性中。

    当AdminView在处理请求时,会首先逐个调用plugins中插件的init_request()方法,插件在该方法中一般进行初始化操作并返回一个Boolean值,告诉AdminView是否要加载该插件

    class MyPlugin(BaseAdminPlugin):

      isExecute = False

      # 根据isExecute 属性值确定是否加载该插件

      def init_request(self, *args, **kwargs):

        return bool(self.isExecute)

    Xadmin在创建插件实例的时候,会将OptionClass的同名属性值替换插件的属性值。

    class SomeModelAdmin(object):

      # xadmin在创建插件实例的时候,会将这里的isExecute属性值替换插件中的isExecute属性值,来确定在此model中是否需要加载该插件

      isExecute = True

      pass

    xadmin.site.register(SomeModel, SomeModelAdmin)

  4、在AdminView执行过程中,可以被插件截获或者修改的方法使用@filter_hook()装饰

    class MyPlugin(BaseAdminPlugin):

      # 使用此装饰器来装饰方法表示该方法可以被插件截获或者修改

      @filter_hook  # xadmin.views.base.filter_hook

      def get_context(self):

        pass

  5、执行插件方法规则:

    1)如果插件的方法没有参数,而AdminView返回结果不为空,会抛出异常

    2)如果插件方法的第一个参数为_,则AdminView方法将会作为第一个参数传入,在插件中通过 _() 来执行。这样就可以实现插件在AdminView方法执行前实现自己的一些逻辑

      class MyPlugin(BaseAdminPlugin):

        def get_context(self, _):

          c = {"key":"value"}

          c.update(_())  # 此时才执行AdminView方法

          return c

    3)如果插件第一个参数不为_,则执行AdminView的方法,将结果作为第一个参数传入

  6、在HTML界面插入插件

    class MyPlugin(BaseAdminPlugin):

      def block_top_toolbar(self, context, nodes):

        ...

        nodes.append(loader.render_to_string("template.html", context_instance = context))

  7、写对应的template.html

  8、将写好的插件加入xadmin-->plugins--->__init__.py文件中

      

  

四、xadmin自定义插件1的更多相关文章

  1. 五、xadmin自定义插件2

    以导入插件为例说明: 1.在xadmin-->plugins下面新建excel.py文件 2.新建ListExcelImportPlugin类,继承BaseAdminPlugin from xa ...

  2. BrnShop开源网上商城第四讲:自定义插件

    重要通知:BrnShop企业版NOSQL设计(基于Redis)已经开源!源码内置于最新版的BrnShop中,感兴趣的园友可以去下载来看看.官网地址:www.brnshop.com. 好了现在进入今天的 ...

  3. Cordova入门系列(四)自定义Cordova插件--showToast

    前三篇Cordova入门系列,简单讲解了Cordova,以及如何调用Cordova插件,今天我们讲解一下如何自己做一个插件. 自定义插件,就是自己写一些安卓java代码,然后和js代码以及配置文件,封 ...

  4. cordova3.X 运用grunt生成plugin自定义插件骨架

    Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等.Cordova还提供了一组统一的JavaScript类库,以及为这些 ...

  5. CKEditor在线编辑器增加一个自定义插件

    CKEditor是一个非常优秀的在线编辑器,它的前身就是FCKEditor,CKEditor据官方说是重写了内核的,但功能和性能比FCKEditor更为强大和优越.记得07年的时候第一次接触FCKEd ...

  6. BrnShop:自定义插件

    BrnShop开源网上商城第四讲:自定义插件 重要通知:BrnShop企业版NOSQL设计(基于Redis)已经开源!源码内置于最新版的BrnShop中,感兴趣的园友可以去下载来看看.官网地址:www ...

  7. Gradle 1.12用户指南翻译——第二十四章. Groovy 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  8. cordova自定义插件的创建过程

    最近学习了cordova插件,记录一下大概的过程,仅供参考. 前期的配置就不记录了网上好多. 在简书上从新写了一个更详细的cordova插件教程,有需要的可以点这里进去看看. 第一步 创建一个cord ...

  9. Cordova与现有框架的结合,Cordova插件使用教程,Cordova自定义插件,框架集成Cordova,将Cordova集成到现有框架中

    一.框架集成cordova 将cordova集成到现有框架中 一般cordova工程是通过CMD命令来创建一个工程并添加Android.ios等平台,这样的创建方式可以完整的下载开发过程中所需要的的插 ...

随机推荐

  1. 开发新手最容易犯的50个 Ruby on Rails 错误(1)

    [编者按]本文最早发布与 JETRuby 博客,主要介绍了开发新手最容易犯的 Ruby 错误.文章系国内 ITOM 管理平台 OneAPM 编译呈现. 一年前,我们创立了以 "Rubyboo ...

  2. 对display主要属性的探究,以及vertical-aligin

    display 首先要简单说明一下display的主要3个主要属性,分别为block,inline-block,inline,这里只提及主要,关于其他的inherit,none等可以自行了解 inli ...

  3. 关于正餐智能POS6.0.1.1改版后,点击反结账进入点菜界面后无法进行加菜的FAQ

    适用版本:智能POS正餐V6.0.1.1+适用情况:点击反结账进入点菜界面后无法进行加菜.原因:为让报表统计的数据更准确解决方案:1.点击反结账,输入用户密码,进入点菜界面. 2.点击结算,进入收银台 ...

  4. java.lang.IllegalStateException: Cannot forward after response has been committed的一个情况解决方法

    java.lang.IllegalStateException: Cannot forward after response has been committed xxx.xxx.doPost(upd ...

  5. Java的sql动态参数

    在C#的方法中可以使用params Parameter[] values来动态获取sql语句中的参数值数组.Java中可以自己封装出一个类似于C#的方法 1.获取结果集 /** * 获取结果集 * @ ...

  6. c/c++拷贝构造函数和关键字explicit

    c/c++拷贝构造函数和关键字explicit 关键字explicit 修饰构造方法的关键字,加上了,就告诉编译器,不可以隐式初始化对象:不加就可以隐式初始化对象: 下面的代码是可以正常编译执行的,但 ...

  7. IPerf——网络测试工具介绍与源码解析(3)

    [线程的生成]   生成线程时需要传入一个thread_Settings类型的变量,thread_Settings包含所有线程运行时需要的信息,命令行选项参数解析后所有得到的属性都存储到该类型的变量中 ...

  8. 学习笔记---json和xml区别

    测试web时经常和网页数据打交道,会遇到json格式和xml格式,整理整理,记录下来. json最常用的格式是键值对. {"firstName": "Brett" ...

  9. openSUSE Leap 15.0 Adobe Flash Player 安装说明

    鉴于Firefox安装配置文件: mozilla_lib=file $MOZ_PROGRAM LIB=lib -bit.*(x86-|S/|PowerPC|ARM aarch64)’ &&am ...

  10. 安全之路 —— 利用APC队列实现跨进程注入

    简介 在之前的文章中笔者曾经为大家介绍过使用CreateRemoteThread函数来实现远程线程注入(链接),毫无疑问最经典的注入方式,但也因为如此,这种方式到今天已经几乎被所有安全软件所防御.所以 ...