admin組件詳解

admin組件詳解

先根據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個視圖方法對象

Alt text

流程圖

>blog

Alt text

至於增刪改查視圖中的方法就步過介紹了,自定義admin組件的基本邏輯就是這樣

相關文章
相關標籤/搜索