模仿admin實(shí)現(xiàn)自動生成url

  • admin源碼流程
    a. 運(yùn)行程序,找到每一個app中的 admin.py 文件,并加載

  • app01.admin.py

  • 創(chuàng)建admin.site中的對象

  • 執(zhí)行對象的 register方法,目的:講注冊類添加到 _registry中
    _registry = {
    models.Role: ModelAdmin(models.Role,admin.site),
    models.UserInfo: ModelAdmin(models.UserInfo,admin.site)
    models.UserType: ModelAdmin(models.UserType,admin.site)
    }

          - app02.admin.py
              - 用app01.admin中創(chuàng)建那個admin.site對象
              - 執(zhí)行對象的 register方法,目的:講注冊類添加到 _registry中 
                  _registry = {
                      models.Role: ModelAdmin(models.Role,admin.site),
                      models.UserInfo: ModelAdmin(models.UserInfo,admin.site)
                      models.UserType: ModelAdmin(models.UserType,admin.site)
                      models.Article: ModelAdmin(models.Article,admin.site)
                  }
      
          admin.site是一個對象(單例模式創(chuàng)建),其中封裝了: 
              _registry = {
                  models.Role: ModelAdmin(models.Role,admin.site),
                  models.UserInfo: ModelAdmin(models.UserInfo,admin.site)
                  models.UserType: ModelAdmin(models.UserType,admin.site)
                  models.Article: ModelAdmin(models.Article,admin.site)
              }
      b. urls.py 
          再次調(diào)用 admin.site 對象的 urls屬性:
              urlpatterns = [
                  url(r'^admin/', admin.site.urls),
              ]
          
          class ModelAdmin(object):
              def __init__(self,model_class,site):
                  self.model_class = model_class
                  self.site = site 
                  
              def changelist_view(self,request):
                  data_list = self.model_class.objects.all()
                  return HttpResponse('列表頁面')
    
              def add_view(self,request):
                  return HttpResponse('添加頁面')
    
    
              def delete_view(self,request,nid):
                  return HttpResponse('刪除頁面')
    
              def change_view(self,request,nid):
                  return HttpResponse('修改頁面')
              
              def get_urls(self):
                   urlpatterns = [
                      url(r'^$', self.changelist_view),
                      url(r'^add/$', self.add_view),
                      url(r'^(.+)/delete/$', self.delete_view),
                      url(r'^(.+)/change/$', self.change_view),
                  ]
                  return urlpatterns
              
              @property 
              def urls(self):
                  return self.get_urls()
              
          
          class AdminSite(object):
              def __init__(self):
                  self._registry = {}
                  
              def register(self,model_class,model_admin):
                  self._registry[model_class] = model_admin(model_class,self)
              
              def get_urls(self):
                  """
                  models.Role: ModelAdmin(models.Role,admin.site),
                  models.UserInfo: ModelAdmin(models.UserInfo,admin.site)
                  models.UserType: ModelAdmin(models.UserType,admin.site)
                  models.Article: ModelAdmin(models.Article,admin.site)
                  """
                  url_list = []
                  for model_class,model_admin in self._registry.items():
                      app_name = model_class._meta.app_label
                      model_name = model_class._meta.model_name 
                      url_list += [
                          url('%s/%s' %(app_name,model_name,), include(model_admin.urls))
                      ]
                      
                  return url_list
                      
              
              @property
              def urls(self):
                  return (self.get_urls(), None,None )
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容