1.启动

#autodiscover_modules('admin', register_to=site)

2.注册

1.单例对象
admin.site = AdminSite(): 单例对象
AdminSite 源码:
class AdminSite(object):def __init__(self, name='admin'):self._registry = {}def register(self, model, admin_class=None, **options):if not admin_class:admin_class = ModelAdminself._registry[model] = admin_class(model, self)  # {Book:ModelAdmin(Book)}

ModelAdmin部分源码:
class ModelAdmin(BaseModelAdmin):list_display = ('__str__',)list_display_links = ()list_filter = ()search_fields = ()actions = []def __init__(self, model, admin_site):self.model = modelself.opts = model._metaself.admin_site = admin_sitesuper(ModelAdmin, self).__init__()def __str__(self):return "%s.%s" % (self.model._meta.app_label, self.__class__.__name__)

BaseModelAdmin部分源码:
def __init__(self):overrides = copy.deepcopy(FORMFIELD_FOR_DBFIELD_DEFAULTS)for k, v in self.formfield_overrides.items():overrides.setdefault(k, {}).update(v)self.formfield_overrides = overrides

2.在admin中注册模型对象

from django.contrib import admin1.admin.site.register(Book)  # admin.site._registry={Book:ModelAdmin(Book)}    1.admin.site是AdminSite()实例化出的对象,并且是单例对象,程序中的admin.site都是同一对象,指向同一内存地址    2.admin.site.register(Book)执行类AdminSite中的register方法,参数model为注册的模型对象BOOK    3.如果只传Book,则admin_class为Django自定义类ModelAdmin    4.self._registry[model] = admin_class(model, self) 为self._registry[Book] = admin_class(Book, self)        即self._registry = {Book:ModelAdmin(Book)} Book是一个对象    5.ModelAdmin实例化出book这个表
2.admin.site.register(Publish)     继续注册另一模型对象时,仍走上述步骤,但此时 self._registry 不再为{},而是{Book:ModelAdmin(Book)},注册完Publisher后    admin.site._registry={Book:ModelAdmin(Book),Publish:ModelAdmin(Publish)}3.自定义admin_class,自定的类必须继承admin。ModelAdminclass Authoconfig(admin.ModelAdmin):passadmin.site.register(Author, Authoconfig) admin_class=Authoconfig {Author:Authoconfig(Author)}此时:admin.site._registry={Book:ModelAdmin(Book),Publish:ModelAdmin(Publish),Author:Authoconfig(Author)}4.启动Django后,会自定义group和user两张表,此时打开admin页面会有五张表5.在Django中新建app02,在admin中注册新的模型对象
 在settings中:INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','app01.apps.App01Config','app02.apps.App02Config',
]

启动Django后,先加载admin,然后执行app01下的apps文件,自动扫描自身和其他app的admin文件,生成admin.site对象。并将app01中模型对象注册到registry中,再执行app02,加载app02中的admin,将模型对象注册到registry中,此时registry中不为空,存放着app01注册的对象
例:在app01的admin中注册,打印查看

from django.contrib import admin
# Register your models here.
from app01 import models
admin.site.register(models.Book)
print("1====>",admin.site._registry)  #此时三张表 user group  book
admin.site.register(models.Publish)
admin.site.register(models.Author)
admin.site.register(models.AuthorDetail)
print("2====>",admin.site._registry) ##此时六张表 user group  book Publish Author AuthorDetail
1====> {<class 'django.contrib.auth.models.Group'>: <django.contrib.auth.admin.GroupAdmin object at 0x0000018D386F2E80>, <class 'django.contrib.auth.models.User'>: <django.contrib.auth.admin.UserAdmin object at 0x0000018D38721908>, <class 'app01.models.Book'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D38739518>}
2====> {<class 'django.contrib.auth.models.Group'>: <django.contrib.auth.admin.GroupAdmin object at 0x0000018D386F2E80>, <class 'django.contrib.auth.models.User'>: <django.contrib.auth.admin.UserAdmin object at 0x0000018D38721908>, <class 'app01.models.Book'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D38739518>, <class 'app01.models.Publish'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D38739400>, <class 'app01.models.Author'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D38739588>, <class 'app01.models.AuthorDetail'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D387395C0>}
在app02中注册order表
from app02 import models
admin.site.register(models.Order)
print("3====>",admin.site._registry)
##此时七张表 user group  book Publish Author AuthorDetail order
#进入admin后,能看到app01里面的表ye能看到app02的表
1====> {<class 'django.contrib.auth.models.Group'>: <django.contrib.auth.admin.GroupAdmin object at 0x0000018D386F2E80>, <class 'django.contrib.auth.models.User'>: <django.contrib.auth.admin.UserAdmin object at 0x0000018D38721908>, <class 'app01.models.Book'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D38739518>}
2====> {<class 'django.contrib.auth.models.Group'>: <django.contrib.auth.admin.GroupAdmin object at 0x0000018D386F2E80>, <class 'django.contrib.auth.models.User'>: <django.contrib.auth.admin.UserAdmin object at 0x0000018D38721908>, <class 'app01.models.Book'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D38739518>, <class 'app01.models.Publish'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D38739400>, <class 'app01.models.Author'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D38739588>, <class 'app01.models.AuthorDetail'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D387395C0>}
3====> {<class 'django.contrib.auth.models.Group'>: <django.contrib.auth.admin.GroupAdmin object at 0x0000018D386F2E80>, <class 'django.contrib.auth.models.User'>: <django.contrib.auth.admin.UserAdmin object at 0x0000018D38721908>, <class 'app01.models.Book'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D38739518>, <class 'app01.models.Publish'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D38739400>, <class 'app01.models.Author'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D38739588>, <class 'app01.models.AuthorDetail'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D387395C0>, <class 'app02.models.Order'>: <django.contrib.admin.options.ModelAdmin object at 0x0000018D387395F8>}
'''

View Code

3.路由设计

1.路由的写法:
urlpatterns = [    url(r'^admin/', admin.site.urls),    url(r'^zhao/', zhao),]
2.路由分发:拼接路由 url(r"^jerd/",([],None,None)) 后面的是元祖,在[]中写url(r'^zhao/', zhao)形式一级路由分发 url(r"^jerd/",([],None,None))
url(r"^jerd/",([url(r'^test1/',test1), 在网页上输入时jerd后面必须添加拼接的路径,不然显示不出来url(r'^test2/', test2),url(r'^test3/', test3),],None,None)),

二级路由分发 url(r"^jerd/"([url(r'^test1/',([],None,None)), ],None,None))
 url(r"^jerd/", ([url(r'^test1/', ([url(r"^test5/", test5),url(r"^test6/", test6),], None, None)),url(r'^test2/', test2),url(r'^test3/', test3),], None, None)),

3.设计执行函数:
def zhao(request):return HttpResponse("这是zhaogaungfei的网页")
def test1(request):return HttpResponse("这是test1的网页")
def test2(request):return HttpResponse("这是test2的网页")
def test3(request):return HttpResponse("这是test3的网页")
def test5(request):return HttpResponse("这是test5的网页")
def test6(request):return HttpResponse("这是test6的网页")

4.封装路由:
在admin中一共有7张表,每张都能进行增,删,改,查四种操作,设置相关路由操作,#单个写的话需要28个路由。封装这些路由urlpatterns = [    url(r'^admin/', admin.site.urls),    url(r'^Xadmin/', (get_urls(),None,None)),  ]
封装路由
 

#二级路由:
def get_url_2():temp=[]temp.append(url(r"^$",list_view))temp.append(url(r"^add/$", add_view))temp.append(url(r"^(\d+)/change/$", change_view))temp.append(url(r"^(\d+)/del/$", del_view))return temp
#一级路由:
def get_urls():temp=[]# 能查看在admin中刚注册的表 {Book:ModelAdmin(Book)} 字典中的Book是对象,而在路由上输入的是字符串,需要转换print(admin.site._registry)for model,admin_class in admin.site._registry.items():app_name=model._meta.app_label  #拿到app的名字model_name=model._meta.model_name #拿到字符串类型的表名temp.append(url(r"^{}/{}/".format(app_name,model_name),(get_url_2(),None,None)),)return temp
def list_view(request):return HttpResponse("这是查看的网页")
def add_view(request):return HttpResponse("这是添加的网页")
def change_view(request,id):return HttpResponse("这是编辑的网页")
def del_view(request,id):return HttpResponse("这是删除的网页")

View Code

 
 
 

 
 
 
 
 

转载于:https://www.cnblogs.com/zgf-666/p/9129683.html

Admin注册和路由分发详解相关推荐

  1. js路由在php上面使用,React中路由使用详解

    这次给大家带来React中路由使用详解,React中路由使用的注意事项有哪些,下面就是实战案例,一起来看一下. 路由 通过 URL 映射到对应的功能实现,React 的路由使用要先引入 react-r ...

  2. python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)

    视图集与路由Routers详解 视图集 ViewSet视图集 代码实现 GenericViewSet视图集 代码实现 ModelViewSet视图集 ReadOnlyModelViewSet视图集 路 ...

  3. React 路由react-router-dom详解

    React 路由react-router-dom详解 ( 路由嵌套 + 路由传参 + 路由权限 + 路由优化 按需导入 + 404页面 ) 前面我们先了解一下 路由是什么? 路由分类有哪些?内置API ...

  4. 25、react 中使用路由 router 详解

    react 中使用路由 router 详解 今天开始最新的一个模块,也是 react 开发中最重要的一部分,就是路由. SPA 理解 我们使用原生的 HTML + CSS + JavaScript 开 ...

  5. 登录注册功能的实现详解(多用户名注册、案例补充)

    登录注册功能的实现详解(多用户名注册.案例补充) 案例功能说明 1.可以保存多个注册用户 2.注册时判断用户名是否存在,不存在可注册 3.注册成功后,跳转到登录页面 4.取出cookie里面的值,进行 ...

  6. 单臂路由的详解及简单配置

    单臂路由的详解及简单配置 前言 1.什么是单臂路由 2.什么是逻辑子接口 3.单臂路由的配置 4.单臂路由的优缺点 1.什么是单臂路由 单臂路由(router-on-a-stick)是指在路由器的一个 ...

  7. 163邮箱域名大全,163邮箱注册申请全流程详解!

    163邮箱域名大全,163邮箱注册申请全流程详解.从免费版到收费版邮箱,用了20年,电子邮箱行业发展至今,越来越的个人白领倾向选择付费邮箱.最近听说TOM VIP邮箱刚上线了163vip.com全新后 ...

  8. ebay注册流程_2017年eBay注册开店流程图文详解

    原标题:2017年eBay注册开店流程图文详解 今天跟大家分享最新的eBay注册开店流程,希望对卖家小伙伴们有所帮助.我们先简单了解一下eBay注册条件. 企业注册eBay需满足以下条件: 合法登记的 ...

  9. java注册登录小程序,详解小程序之简单登录注册表单验证

    这段时间在做员工管理的小程序,前期在登录注册上花了不少功夫,今天就给大家分享下. 效果图,wxss的内容较简单,自己编写即可. ##主要内容 一.首先我是在util.js中引入表单正则验证规则,给予l ...

最新文章

  1. UE4编译专用服务器
  2. 洛谷P1456 Monkey King
  3. git 本地代码到github(转)
  4. android avd orientation support,Android AVD-无法旋转风景/人像
  5. Union-find
  6. 一个列表中按钮的不同样式
  7. windows 系统监视器_使用Windows 7中的可靠性监视器对计算机问题进行故障排除
  8. 【ArcGIS遇上Python】python批量获取栅格数据四至(top,bottom,left,right)坐标代码
  9. CentOS7——安装JDK和Tomcat
  10. Spring AOP介绍
  11. H3C进入目录---用户视图
  12. python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法...
  13. CNN实现手写数字识别
  14. Java+PDFBox将PDF转成图片
  15. 5.Linux系统中解压缩详解
  16. 家政维修小程序+上门预约小程序+VUE前后端分离+uniapp(附近师傅+门店入驻+在线抢单服务APP、小程序、公众号、H5)
  17. 我对APPCAN的初步理解
  18. 【笔记】Oracle触发器,根据另外一张表是否存在此记录,来判断是否更新
  19. oracle数据库数据备份
  20. socket10053

热门文章

  1. 史上最全解读 | 飞桨模型库重大升级,主流算法模型全覆盖
  2. 人类第一次将42写成3个整数的立方和,最后一个100以内的自然数告破
  3. 第一家科创板IPO的AI公司:年净利1.58亿,华为小米背后功臣,北大物理系校友创办...
  4. 成都铁路警方联合多部门开展反恐防暴演练
  5. 古老的SSM企业级应用
  6. 如何去掉桌面标签背影
  7. 搭建前端私有npm杂记
  8. CDH的几个包的下载地址
  9. 2013年全球最佳工作
  10. dev chartcontrol获取x y轴的值_2020年深圳蛇口x情怀当铺展览详情(时间+地点+门票)...