Admin整体底层实现原理

Admin整体底层实现原理

1.启动项目加载每个app目录下的admin.py

app01/admin.py

admin.site.register(models.Depart, admin.ModelAdmin)
admin.site.register(models.UserInfo)

1.1Admin文件的加载过程

如何加载admin文件的呢?

django/contrib/admin/apps

具体代码如下:

class AdminConfig(SimpleAdminConfig):
    default = True

    def ready(self):
        super().ready()
        self.module.autodiscover()

django/contrib/admin/__init__

def autodiscover():
    autodiscover_modules("admin", register_to=site)

这就将每个app下的admin文件加载进来了!

如果想要让自己写的某些文件在django项目启动的时候自动执行,可以在自己注册的app下的apps中定义

那我的举例

api/apps下的代码如下

class ApiConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'api'
	
    """
    1.要有ready方法
    2.执行super
    3.autodiscover_modules("xx")   ——> xx指的是每个app下的文件,当django项目启动后,会自动执行这个xx文件
    """
    def ready(self):
        super().ready()

        from django.utils.module_loading import autodiscover_modules
        autodiscover_modules("xx")

这里就打印出来了!

2.生成相应的配置关系

class AdminSite:
	def __init__(self):
		self._registery = {
			Depart:ModelAdmin(),
			UserInfo:ModelAdmin(),
		}

	def register(self,model,config_class=ModelAdmin):
		self,_registery[model] = config_class()


site = AdminSite()

3.加载路由【动态生成路由底层的机制】

urlpatterns = [
    path('admin/', admin.site.urls),
    path('admin/', ([
    	"/login" ——> login函数
    	"/logout" ——> logout函数

    	# 生成多少表的增删改查,去循取AdminSite中注册了几个类
    	"app01/depart" -> ([     		obj = BaseCurd(models.Depart)
    		/							——> 函数    obj.list
    		/add,    					——> 函数    obj.add
    		/change,					——> 函数    obj.edit
    		/2/delete,					——> 函数    obj.delete
    	],None,None)

    	"app01/userinfo" -> ([ 			obj = BaseCurd(models.UserInfo)
    		/list,    		——> 函数    ——> 函数    obj.list
    		/add,			——> 函数    ——> 函数    obj.add
    		/edit,			——> 函数    ——> 函数    obj.edit
    		/delete,		——> 函数    ——> 函数    obj.delete
    	],None,None)

    ],None,None)),
]

None ——> app_name
None ——> namespace

4.处理请求的能力【基于类实现的】

class BaseCurd:
	def __init__(self,model_class):
		self.model_class = model_class


	def list():
		pass

	def add():
		pass

	def edit():
		pass

	def delete():
		pass

那如何将配置【ModelAdmin或者其他自定义的一些】搞进来呢? 根据配置项的不同做不同的展示

class BaseCurd:
	def __init__(self,model_class):
		self.model_class = model_class
		self.配置 = 配置

	def list():
		if self.配置.list_display:
			....
		else:
			......

	def add():
		pass

	def edit():
		pass

	def delete():
		pass

那如何将配置中的自定义模板搞进来呢? 根据配置项的不同做不同的展示

class BaseCurd:
	def __init__(self,model_class):
		self.model_class = model_class
		self.配置 = 配置

	def list():
		if self.配置.list_display:
			....
		else:
			......

		if self.配置.charge_list:
			return render(request,"返回自己定义的")

		return render(request,"admim/charge_list.html")  # 默认的
	def add():
		pass

	def edit():
		pass

	def delete():
		pass

5.模板相关

底层寻找模板的优先级?

1.首先去项目根目录下的templates中寻找

TEMPLATES = [
	'DIRS': [BASE_DIR / 'templates']
]

2.根据app注册的顺序挨个寻找

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    "app01.apps.ApiConfig"
]
posted @ 2024-10-18 10:46  清风拂山岗(小高同学)  阅读(0)  评论(0编辑  收藏  举报