先根據admin組件啓動流程複習下django項目啓動至請求過來發生的事python
1將admin組件註冊進app
2django項目啓動
3在運行到定製的admin時執行其下面的apps文件中類下面ready函數在項目啓動時就執行每一個app下面的admin文件
4當用戶發送請求進來首先通過wsgi處理
5再運行中間件中的各個組件對請求進行處理
6在url中找到對應的視圖函數並執行返回一個response對象
7返回對象再通過中間件處理(此時執行順序是從後往前)django
知識點app
一、django admin利用的是python獨有的單例模式來調用的再python中每個py文件的執行都會生成一個pyc的文件,當下次再調用時,並不會在執行一次py文件, 而是拿到先前生pyc文件的空間中的數據。函數
二、 改寫方法指定app啓動時,執行每一個app目錄下的stark文件url
def ready(self): autodiscover_modules('stark')
3經過查看源碼admin中的註冊方法經過site調用,site即一個文件類中產生的單例對象,新建文件定義一個生成site對象的方法,定義register方法spa
class StarkSite(object): def __init__(self, name='admin'): self._registry = {} #記錄註冊的model類 def register(self, model, admin_class=None, **options): if not admin_class: admin_class = ModelStark # 配置類 self._registry[model] = admin_class(model)
4model註冊進此時應該生成對應的url,每張表都應該有本身獨有的url,url對應着表中數據的增刪改查,那麼設計url尤其重要,此時咱們採用url分發的方法,一級路由由表名進行命名,二級路由另外寫個類,用來調用(由於site是單例,若是寫在一個類裏面,則每一個url都須要生成4個url,代碼重複,應該在用戶訪問某張表的時候生成對應的增刪改查路由)設計
def get_urls(self): temp = [] for model_class, config_obj in self._registry.items(): print("===>", model_class, config_obj) model_name = model_class._meta.model_name app_label = model_class._meta.app_label print("===>", app_label, model_name) temp.append(url(r'^%s/%s/' % (app_label, model_name),config_obj.urls))
五、config_obj是配置類對象,二級路由放入配置類中,在用戶註冊時,若是有本身的配置類則用本身的 ,沒有則用默認的 中間件
def get_urls(self): temp=[ url("^$",self.list_view,name="%s_%s_list"%(self.app_model_name)), url("^add/$",self.add_view,name="%s_%s_add"%(self.app_model_name)), url("^(\d+)/change/$",self.change_view,name="%s_%s_change"% (self.app_model_name)), url("^(\d+)/delete/$",self.delete_view,name="%s_%s_delete"%(self.app_model_name)), ] temp.extend(self.extra_urls()) return temp @property #此裝飾器的做用是讓方法變成能夠像屬性同樣調用 def urls(self): return self.get_urls(),None,None
6在裝飾類下定義增刪改查4個視圖方法對象
>blog
至於增刪改查視圖中的方法就步過介紹了,自定義admin組件的基本邏輯就是這樣