1. 程式人生 > >Django-admin組件

Django-admin組件

install 註冊 req min urls.py文件 多個 單例 util apps

如何仿照admin實現一個自定義的增刪改查的組件?

一、啟動
    1、創建一個與Django項目無關的,可以單獨分離出來用在多個項目上的名稱為my_admin的app:
        python manage.py startapp my_admin    
    2、創建兩個與Django項目有關的兩個app:
        python manage.py startapp app01
        python manage.py startapp app02
    3、在settings.py中的INSTALLED_APPS變量中添加:
        app01.apps.App01Config
, app02.apps.App02Config, my_admin.apps.MyAdminConfig, 4、將my_admin、app01和app02中的admin.py文件全部刪除,重新分別在app01和app02中添加myAdmin.py 5、app01下models.py中添加Book,Publish,AuthorDetail,Author類 6、app02下models.py中添加Food類 7、遷移數據庫: python manage.py makemigrations python manage.py migrate
8、my_admin的app下有一個apps.py文件,在此文件中添加: from django.utils.module_loading import autodiscover_modules class MyAdminConfig(AppConfig): name = my_admin def ready(self): autodiscover_modules("myAdmin")
二、註冊
    1、my_admin的app下創建一個python package的包,名稱為service
    
2、在service文件夾下新建一個sites.py文件 3、sites.py中添加以下代碼: class ModelMyAdmin(): list_display = [] def __init__(self,model): self.model = model class MyAdminSite(): def __init__(self): self._registry = {} def register(self,model,my_admin_class = None): if not my_admin_class: my_admin_class = ModelMyAdmin self._registry[model] = my_admin_class(model) site = MyAdminSite() 4、在app01下的myAdmin.py中註冊模型類: from my_admin.service.sites import ModelMyAdmin,site from app01.models import Book,Publish,Author,AuthorDetail class BookConfig(ModelMyAdmin): list_display = ["title","publish_date","price"] site.register(Book,BookConfig) site.register(Publish) site.register(Author) site.register(AuthorDetail) print("app01下的site._registry-->",site._registry) 啟動項目後,打印出此字典證明已經註冊成功 { <class app01.models.Author>: <my_admin.service.sites.ModelMyAdmin object at 0x0000000003EA70B8>, <class app01.models.AuthorDetail>: <my_admin.service.sites.ModelMyAdmin object at 0x0000000003EB1B00>, <class app01.models.Book>: <app01.myAdmin.BookConfig object at 0x0000000003EB1EB8>, <class app01.models.Publish>: <my_admin.service.sites.ModelMyAdmin object at 0x0000000003EB1EF0> }
三、設計url
    1、在urls.py文件中:
        from django.conf.urls import url
        from my_admin.service.sites import site
        
        urlpatterns = [
            url(r^my_admin/,site.urls),
        ]
        
    2、在sites.py文件中的MyAdminSite類中繼續添加一個urls方法:
        from django.conf.urls import url
        def get_urls_01(self):
            res = []
            for model,config_obj in self._registry.items():
                model_name = model._meta.model_name
                app_label = model._meta.app_label
                add_url = url(r{}/{}/.format(app_label,model_name),config_obj.urls)    #config_obj:某個model的配置類(自定義配置類或者默認配置類)對象     
                res.append(add_url)
            return res
        
        @property
        def urls(self):
            return self.get_urls_01(),None,None
            
    3、在sites.py文件中的ModelMyAdmin類中繼續添加一個urls方法:
        from django.shortcuts import render
        def listview(self,request):
            print("self-->",self) # 當前訪問模型類的配置類對象
            print("self.model-->",self.model) # 當前訪問模型類
            
            data = self.model.objects.all()
            return render(request,"listview.html",{"data_list":data})    
            
        def addview(self,request):
            return HttpResponse("addview")

        def changeview(self,request, id):
            return HttpResponse("changeview")

        def deleteview(self,request, id):
            return HttpResponse("deleteview")    
            
        def get_urls_02(self):
            res = [
                url(r^$,self.listview)
                url(r^add/$,self.addview)
                url(r^(\d+)/change/$,self.changeview)
                url(r^(\d+)/delete/$,self.deleteview
            ]
            return res
        
        @property        
        def urls(self):
            return self.get_urls_02(),None,None
為什麽要將get_urls_02的方法寫入到ModelMyAdmin類中,而不寫在MyAdminSite類中?
    將get_urls_02寫入到MyAdminSite類中,由於單例模式造成返回的是同一個頁面,如果是簡單的返回一個HttpResponse對象,是可以的;
    但是現實需求是不同的表要展示不同的視圖數據而且不同的表要有不同的配置信息,故需要寫入在ModelMyAdmin類中。

Django-admin組件