python第七十二天,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.基于模块

原文地址:https://www.cnblogs.com/liguodeboke/p/11280323.html

时间: 2024-11-10 04:39:16

python第七十二天,admin源码分析的相关文章

Python之contextlib库及源码分析

Utilities for with-statement contexts __all__ = ["contextmanager", "closing", "AbstractContextManager",           "ContextDecorator", "ExitStack", "redirect_stdout",           "redirect_stde

七)CodeIgniter源码分析之Benchmark.php

1 <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); 2 // ------------------------------------------------------------------------ 3 4 /** 5 * CodeIgniter Benchmark Class 6 */ 7 class CI_Benchmark { 8 9 /** 10 * List of all be

Netty源码分析第7章(编码器和写数据)----&gt;第2节: MessageToByteEncoder

Netty源码分析第七章: Netty源码分析 第二节: MessageToByteEncoder 同解码器一样, 编码器中也有一个抽象类叫MessageToByteEncoder, 其中定义了编码器的骨架方法, 具体编码逻辑交给子类实现 解码器同样也是个handler, 将写出的数据进行截取处理, 我们在学习pipeline中我们知道, 写数据的时候会传递write事件, 传递过程中会调用handler的write方法, 所以编码器码器可以重写write方法, 将数据编码成二进制字节流然后再继

TeamTalk源码分析(七) —— 服务器端msf源码分析

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> TeamTalk源码分析(七) -- 服务器端msf源码分析 - 左雪菲的专栏 - 博客频道 - CSDN.NET 左雪菲的专栏 欢迎访问我的个人网站:http://www.hootina.org 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &n

Django之admin的使用及源码分析

一.admin组件使用 Django本身提供了基于 web 的管理工具.其管理工具是django.contrib的一部分,可在settings.py中的 INSTALLED_APPS 看到: INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'dj

Nouveau源码分析(七): 各SUBDEV/ENGINE初始化 (1)

Nouveau源码分析(七) 虽然各个SUBDEV/EGINE的初始化实际还是在nouveau_drm_load里,但还是换个标题吧. 等把各个SUBDEV/ENGINE之类的说完再换回去. 上次已经按着初始化的顺序介绍了一下各个subdev的用途,现在按顺序,首先来看VBIOS的ctor函数: // /drivers/gpu/drm/nouveau/core/subdev/bios/base.c 537 struct nouveau_oclass 538 nouveau_bios_oclass

K-近邻算法的Python实现 : 源码分析

网上介绍K-近邻算法的例子很多,其Python实现版本基本都是来自于机器学习的入门书籍<机器学习实战>,虽然K-近邻算法本身很简单,但很多初学者对其Python版本的源代码理解不够,所以本文将对其源代码进行分析. 什么是K-近邻算法? 简单的说,K-近邻算法采用不同特征值之间的距离方法进行分类.所以它是一个分类算法. 优点:无数据输入假定,对异常值不敏感 缺点:复杂度高 好了,直接先上代码,等会在分析:(这份代码来自<机器学习实战>) def classify0(inx, data

Cocos2d-X3.0 刨根问底(七)----- 事件机制Event源码分析

这一章,我们来分析Cocos2d-x 事件机制相关的源码, 根据Cocos2d-x的工程目录,我们可以找到所有关于事件的源码都存在放在下图所示的目录中. 从这个event_dispatcher目录中的文件命名上分析 cocos2d-x与事件相关的类一共有四种, Event, EventListener,EventDispatcher, Touch分别为 事件,事件侦听器,事件分发器,触摸 我们先从Event类开始. 打开CCEvent.h文件 /** * Base class of all ki

Python之美[从菜鸟到高手]--浅拷贝、深拷贝完全解读(copy源码分析)

可悲的我一直以为copy模块是用C写的,有时候需要深入了解deepcopy,文档描述的实在太简单,还是不知所云. 比如说最近看sqlmap源码中AttribDict的_deepcopy__有些疑惑, def __deepcopy__(self, memo): retVal = self.__class__() memo[id(self)] = retVal for attr in dir(self): if not attr.startswith('_'): value = getattr(se