四、xadmin自定义插件1

插件原理:

  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文件中

      

  

posted @ 2018-08-28 17:15  陌上花开缓缓归!  阅读(1618)  评论(0编辑  收藏  举报
Top ↑