首页 > 其他分享 >Admin整体底层实现原理

Admin整体底层实现原理

时间:2024-10-18 10:51:57浏览次数:7  
标签:Admin self django admin 原理 model class def 底层

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

标签:Admin,self,django,admin,原理,model,class,def,底层
From: https://www.cnblogs.com/pythonav/p/18473792

相关文章

  • 深入解析React DnD拖拽原理,轻松掌握拖放技巧!
    深入解析ReactDnD拖拽原理,轻松掌握拖放技巧! 我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。。本文作者:霁明一、背景1、业务背景业务中会有一些需要实现拖拽的场景,尤其是偏视觉方向以及......
  • VU9P处理板设计原理图:412-基于单XCVU9P+双DSP C6678的双FMC接口 100G光纤传输加速计算
    基于单XCVU9P+双DSPC6678的双FMC接口100G光纤传输加速计算卡  一、板卡概述板卡包括一片Xilinx FPGA  XCVU9P,两片 TI 多核DSP TMS320C6678及其控制管理芯片CFPGA.设计芯片满足工业级要求。FPGA VU9P 需要外接4路QSFP+(100Gbps)及其两个FMC HPC接......
  • Clickhouse原理解析
    Clickhouse的标签#OLAP#列式存储行式数据库和列式数据库适用于不同的业务场景:如何查询多久查一次各类查询的比例各类查询要求的延迟和吞吐量每种查询读取多少数据读和写的关系,比例数据集的大小如何使用本地数据集是否用事务数据复制和完整性的要求OLAPOLAP的特点......
  • NDT的原理分析与实现
    文章目录前言一、基本原理1.原理介绍2.优化流程(1)初始化阶段(2)配准阶段前言相关中文博客1:CSDN强烈推荐相关中文博客2:CSDN3D变换雅可比海森矩阵计算:CSDN一、基本原理1.原理介绍在使用NDT(NormalDistributionsTransform)进行扫描配准时,目标是找到当前扫描......
  • 天幕容器vector的底层实现,让这个容器的建造在你面前一览无余
    文章目录一、什么是vector?二、bit::vector的设计思路三、bit::vector的类定义四、构造函数与析构函数1.默认构造函数2.区间构造函数3.填充构造函数4.初始化列表构造函数5.拷贝构造函数6.析构函数五、push_back和内存管理六、插入操作(insert)七、删除操作(e......
  • OCR文字识别:深入剖析原理与技术实现全流程
    在当今信息化时代,OCR(OpticalCharacterRecognition,光学字符识别)技术已经成为我们日常生活和工作中不可或缺的一部分。无论是证件识别、名片识别,还是车牌识别,OCR技术都发挥着重要作用。本文将深入剖析OCR文字识别的原理与技术实现全流程,帮助读者更好地理解这一技术。一、OCR技......
  • 图像cv常用操作原理和方法说明
    图像cv常用操作原理和方法说明灰度、平滑、滤波、仿射变化、形态学BORDERTYPE边填充边扩展时填充值的方式cv.BORDER_DEFAULT等同于BORDER_REFLECT_101可通过cv.copyMakeBorder查看效果灰度变化作用如果拍照时曝光不足或曝光过度,照片会灰蒙蒙的或者过白,这实......
  • 剖析线程池实现原理
    前置推荐阅读:java并发之线程池使用-CSDN博客自定义实现一个带监控的线程池首先我们继承ThreadPoolExecutor,实现构造函数以及重写beforeExecute和afterExecute两个函数,具体调用我们会在代码实现层面进行详细的分析。importjava.util.concurrent.*;publicclassAsyncTh......
  • 三相交流电子负载的原理
    三相交流电子负载是一种模拟实际负载工作状态的电源设备,主要用于测试各种交流电源设备(如发电机、逆变器、变压器等)的性能和可靠性。它能够精确地控制电流、电压、频率、相位等参数,以满足不同的测试需求。三相交流电子负载通常接受三相或单相交流电源输入,其电压和频率范围可以根据......
  • Java 8 的 Lambda、函数式接口、Stream 用法和原理
    我是风筝,公众号「古时的风筝」。一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农!文章会收录在JavaNewBee中,更有Java后端知识图谱,从小白到大牛要走的路都在里面。公众号回复『666』获取高清大图。就在今年Java25周岁了,可能比在座的各位中的一些......