xadmin自定義插件
插件原理:
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自定義插件