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"
]