欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Django-admin组件

程序员文章站 2022-10-04 23:10:06
知识预览 Django 如何使用admin组件来对后台数据进行管理的? Django admin如何实现后台数据管理的?(admin源码解析) 如何仿照admin实现一个自定义的增删改查的组件? 回到顶部 Django 如何使用admin组件来对后台数据进行管理的? 在每个a ......

如何仿照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组件

Django-admin组件