解析admin的源码

第一步:项目启动,加载settings文件中的 INSTALLED_APPS

里边有几个app就加载几个,按照注册顺序来执行。

第二步:其中加载的是admin.py,加载每一个app下的admin.py文件

第三步:执行代码

第四步:看admin.site走的流程

咱走一下源码

总结一下:

第五步:执行register方法

  1. admin.site.register(Book, BookAdmin)
  2. admin.site.register(Publish)
  1. class ModelAdmin(BaseModelAdmin):pass
  2.  
  3. def register(self, model_or_iterable, admin_class=None, **options):
  4. if not admin_class:
  5. admin_class = ModelAdmin
  6. # Instantiate the admin class to save in the registry
  7. self._registry[model] = admin_class(model, self)

注册就结束了!

补充一下:

在每一个app的admin .py中加上

  1. print(admin.site._registry) 执行结果?

app01:

app02:

第六步:admin的URL配置

  1. urlpatterns = [
  2. url(r'^admin/', admin.site.urls),
  3. ]
  1. class AdminSite(object):
  2.  
  3. def get_urls(self):
  4. from django.conf.urls import url, include
  5.  
  6. urlpatterns = []
  7.  
  8. # Add in each model's views, and create a list of valid URLS for the
  9. # app_index
  10. valid_app_labels = []
  11. for model, model_admin in self._registry.items():
  12. urlpatterns += [
  13. url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)),
  14. ]
  15. if model._meta.app_label not in valid_app_labels:
  16. valid_app_labels.append(model._meta.app_label)
  17.  
  18. return urlpatterns
  19.  
  20. @property
  21. def urls(self):
  22. return self.get_urls(), 'admin', self.name

总结admin源码解析:

  1. 1:在Django项目启动时,加载settings中的install_apps,扫描每个APP项目下的admin.py文件的文件,
  2. 创建admin.site中的对象,site = AdminSite(),本质实例化一个对象,以后不管谁来调用都使用这个对象,
  3. 执行对象的register方法,目的将注册类添加到_register中,
  4. admin.site是一个对象(单例模式创建),其中封装了_register
  5. 2:再次调用admin.siteurls属性。
  6. 返回了一个元组,元组有三个元素,self.get_urls(),'admin 'self.name
  7. 第一个元素是一个函数返回的是一个列表,列表中是url,是循环admin.site中的_register(ruanzhiste),
  8. 中的注册类,生成url,放在列表中。为每个注册类生成一级URL,其次调用类的样式对象下的get_url_func(self)
  9. 函数,生成二级URL,同时为每一个增删改查URL创建别名,用于反向解析,每个url对应一个视图函数。

django之admin源码解析的更多相关文章

  1. django -admin 源码解析

    admin源码解析 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单 ...

  2. admin源码解析以及仿照admin设计stark组件

    ---恢复内容开始--- admin源码解析 一 启动:每个APP下的apps.py文件中. 首先执行每个APP下的admin.py 文件. def autodiscover(): autodisco ...

  3. admin源码解析及自定义stark组件

    admin源码解析 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单 ...

  4. day 65 crm(2) admin源码解析,以及简单的仿造admin组件

    前情提要: crm中的admin组件重写. 一:admin的autodiscover 作用:实现扫面该项目中的所有的admin 1:执行顺序-> 按照注册的顺序执行 二:单例模式 1:普通案例的 ...

  5. Django的admin源码浅析和模仿

    admin模块: admin提供了5种接口 list_display, 指定数据展示字段,不能放多对多字段

  6. Django中CBV源码解析

    使用 关于FBV和CBV的使用在之前有提到,点击穿越. 准备 首先在视图中创建一个类并继承 django.views.View 类,在类中可定义各种请求方式对应执行的函数(函数名为请求方式名称小写). ...

  7. Django之CBV源码解析

    l链接跳转:https://www.cnblogs.com/hnlmy/p/9662798.html 以及https://www.cnblogs.com/hnlmy/p/10603999.html

  8. Django框架 之 admin管理工具(源码解析)

    浏览目录 单例模式 admin执行流程 admin源码解析 单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在 ...

  9. Django 之 admin组件使用&源码解析

    admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.可以在项目的 settings.py 中的 INSTALLED ...

随机推荐

  1. 洛谷P3193 [HNOI2008]GT考试 kmp+dp

    正解:kmp+dp+矩阵优化 解题报告: 传送门! 啊刚说想做矩阵优化dp的字符串题就找到辣QwQ虽然不是AC自动机的但都差不多嘛QwQ 首先显然可以想到一个dp式?就f[i][j]:凑出i位了,在s ...

  2. 【Python基础】*args,**args的详细用法

     Python基础知识:*args,**args的详细用法 参考:https://blog.csdn.net/qq_29287973/article/details/78040291 *args 不定 ...

  3. Javascript 对象复制(深浅拷贝)

    一.数据类型分类: 基本变量 引用类型 二.什么叫做指针指向 栈内存.堆内存.指针指向(如下红圈圈的斜线). 三.赋值.拷贝.引用区别? 赋值指一个变量赋予某个值,包含两种方式,一种是直接量,另一种, ...

  4. mysql from dual插入实现不插入重复记录

    在mysql中插入一或者多条记录的时候,要求某个字段的值唯一,但是该字段没有添加唯一性索引,可用from dual解决. select * from (select '2015080109' a,2 ...

  5. JavaScript深度克隆

    深度克隆函数: function deepClone(obj){ var str = ""; var newobj = obj.constructor === Array ? [] ...

  6. 利用session防止表单重复提交

    转自:http://www.cnblogs.com/xdp-gacl/p/3859416.html 利用Session防止表单重复提交 对于[场景二]和[场景三]导致表单重复提交的问题,既然客户端无法 ...

  7. (4.6)mysql备份还原——深入解析二进制日志(2)binlog参数配置解析

    关键词:binlog配置,binlog参数,二进制日志配置,二进制文件参数配置 关键词:binlog缓存,binlog 刷新 0.bin写入流程 写binlog流程如下:# 数据操作buffer po ...

  8. finecms同时调用子栏目和子栏目的文章怎么操作

    之前ytkah写过dedecms如何调用当前栏目的子栏目及子栏目文章,那如果是finecms如何同时调用子栏目和子栏目的文章呢? {list action=category pid=0 id=31} ...

  9. pattern.define注意事项

    1.PAT:最好不要所有的关键字后面都用|,导致整条pattern变成无限统配.

  10. entry.define编程思路

    0.lua将文字传给场景脚本. 1.场景脚本将pattern.define文件中的PAT当作子弹(水泡弹,带颜色) 2.用户的问题作为客户端的请求,发送给服务器端 3.服务器端接受客户端的问题请求 4 ...