admin源码分析
django settings 源码分析
导入settingso模块,进入源码,会发现settings是一个 单例 LazySettings类实例化产生的一个对象,
LazySettings实例化后就会走它内部的_setup函数
importlib模块的作用 : 以字符串的形式导入模块,拿到能够访问该模块名称 空间的名字
module = imporlib.import_module('字符串')
settings配置用户自定义的原理:
项目启动后,会使用os.environ.settdefault('xxx','conf.settings')在os中设置一个全局大字典,放置暴露给用户的settings文件路径
会先加载全局的配置,然后再加载用户配置的,如果用户配置了,会将全局的配置顶掉。
而没有设置的项就会采用默认配置,来实现settings内部用户自定义配置的功能
	首先会for循环默认配置,使用dir(全局配置模块) 获得所有该模块下的字符串形式的名称列表,然后对名称进行判断,
因为如果用需要自定义的配置,变量名必须大写,所以经行筛选,将符合要求的配置以键值对的形式使用setattr存入settings对象中
	然后从全局大字典,从os中的全局大字典中获取暴露给用户的settings文件路径,使用import_module 将路径以字符串的形式导入模块
	然后for循环该模块,获得暴露给用户的配置文件中的所有配置,以键值对的形式存入到settings对象中
实现django中的settings  用户配置了就使用用户自定义的配置的settings,用户没有配置就使用django全局的settings的
导入模块发生的三件事:
	1. 创建运行模块的名称空间
	2. 创建被导入模块的模块名称空间,并执行该模块所有代码,将产生的名字全部放入该名称空间中
	3. 然后在执行文件中产生一个名字,指向被导入模块的名称空间
	
	
	
admin的五大配置参数
		当用户没有自定义方法的时候。admin会使用默认的ModelAdmin。当用户自定义了方法,会使用用户自定义的方法
	list_display = ['字段名']  			控制在admin页面中展示字段的    						(控制展示字段)
	
	list_display_links = [‘字段名’] 	在后台筛选时可以被筛选的字段。						(控制跳转字段)
	
	search_fields = [‘字段名’]   		查询器,以字段名经行查询,在查询的时候是“或”的关系,(或查询)
	
	list_filter = [‘外键字段名’]  		右侧过滤器 在内部添加外键字段,会筛选所对应的数据, (如果有多个外键字段,可以用与查询  挨个筛选,
										可以添加多对多的字段,在过滤的时候是“与”的关系		  比如先筛选人名,再筛选它写的书,and操作 )
										
	
	
	# 批量修改值。在queryset_update(字段名=‘新值’) 可以将选中的字段更改为指定的值
	def path_init(self,request,queryset):
        queryset.update(price=666)
    path_init.short_description = '价格批量修改'
    actions = [path_init]
	
	
	配置类的概念
		
		
admin 源码分析
	django启动的会依次执行每一个app应用下的admin.py文件
		模块在导入的时候会执行__all__方法。当文件被导入的时候。可以被使用的所有名字
# 下方导入的模块,与定义的函数。决定了django每次启动的时候会执行该函数,会去每一个应用下寻找admin.py文件
from django.utils.module_loading import autodiscover_modules  
	def autodiscover():
		autodiscover_modules('admin', register_to=site)   # 如果将 'admin' 替换成别的,就会执行别的。 
		
		
		
实现单例的几种方式
	1.基于classmethod
	2.基于装饰器
	3.基于元类__call__
	4.基于__new__
	5.基于模块
	
		
		
		
                
            
        
浙公网安备 33010602011771号