1. 程式人生 > >xadmin自定義插件

xadmin自定義插件

結果 返回結果 val 插入 拋出異常 ext reg exec 表示

插件原理:

  Xadmin中每個頁面都是一個AdminView對象返回的HTTPResponse結果。

  Xdamin插件所做的事情就是其實就是在AdminView執行過程中改變其執行邏輯或是改變其返回的結果,起到改變或者增強原有功能的效果

插件運行過程:

  1、自定義插件 需繼承 BaseAdminPlugin

    class MyPlugin(BaseAdminPlugin):

      pass

  2、開發好的的插件 首先要註冊到xadmin中

    xadmin.site.register(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自定義插件