Admin注册和路由分发详解
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注册和路由分发详解相关推荐
- js路由在php上面使用,React中路由使用详解
这次给大家带来React中路由使用详解,React中路由使用的注意事项有哪些,下面就是实战案例,一起来看一下. 路由 通过 URL 映射到对应的功能实现,React 的路由使用要先引入 react-r ...
- python Django Rest_Framework框架 视图集与路由Routers详解(图文并茂版)
视图集与路由Routers详解 视图集 ViewSet视图集 代码实现 GenericViewSet视图集 代码实现 ModelViewSet视图集 ReadOnlyModelViewSet视图集 路 ...
- React 路由react-router-dom详解
React 路由react-router-dom详解 ( 路由嵌套 + 路由传参 + 路由权限 + 路由优化 按需导入 + 404页面 ) 前面我们先了解一下 路由是什么? 路由分类有哪些?内置API ...
- 25、react 中使用路由 router 详解
react 中使用路由 router 详解 今天开始最新的一个模块,也是 react 开发中最重要的一部分,就是路由. SPA 理解 我们使用原生的 HTML + CSS + JavaScript 开 ...
- 登录注册功能的实现详解(多用户名注册、案例补充)
登录注册功能的实现详解(多用户名注册.案例补充) 案例功能说明 1.可以保存多个注册用户 2.注册时判断用户名是否存在,不存在可注册 3.注册成功后,跳转到登录页面 4.取出cookie里面的值,进行 ...
- 单臂路由的详解及简单配置
单臂路由的详解及简单配置 前言 1.什么是单臂路由 2.什么是逻辑子接口 3.单臂路由的配置 4.单臂路由的优缺点 1.什么是单臂路由 单臂路由(router-on-a-stick)是指在路由器的一个 ...
- 163邮箱域名大全,163邮箱注册申请全流程详解!
163邮箱域名大全,163邮箱注册申请全流程详解.从免费版到收费版邮箱,用了20年,电子邮箱行业发展至今,越来越的个人白领倾向选择付费邮箱.最近听说TOM VIP邮箱刚上线了163vip.com全新后 ...
- ebay注册流程_2017年eBay注册开店流程图文详解
原标题:2017年eBay注册开店流程图文详解 今天跟大家分享最新的eBay注册开店流程,希望对卖家小伙伴们有所帮助.我们先简单了解一下eBay注册条件. 企业注册eBay需满足以下条件: 合法登记的 ...
- java注册登录小程序,详解小程序之简单登录注册表单验证
这段时间在做员工管理的小程序,前期在登录注册上花了不少功夫,今天就给大家分享下. 效果图,wxss的内容较简单,自己编写即可. ##主要内容 一.首先我是在util.js中引入表单正则验证规则,给予l ...
最新文章
- UE4编译专用服务器
- 洛谷P1456 Monkey King
- git 本地代码到github(转)
- android avd orientation support,Android AVD-无法旋转风景/人像
- Union-find
- 一个列表中按钮的不同样式
- windows 系统监视器_使用Windows 7中的可靠性监视器对计算机问题进行故障排除
- 【ArcGIS遇上Python】python批量获取栅格数据四至(top,bottom,left,right)坐标代码
- CentOS7——安装JDK和Tomcat
- Spring AOP介绍
- H3C进入目录---用户视图
- python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法...
- CNN实现手写数字识别
- Java+PDFBox将PDF转成图片
- 5.Linux系统中解压缩详解
- 家政维修小程序+上门预约小程序+VUE前后端分离+uniapp(附近师傅+门店入驻+在线抢单服务APP、小程序、公众号、H5)
- 我对APPCAN的初步理解
- 【笔记】Oracle触发器,根据另外一张表是否存在此记录,来判断是否更新
- oracle数据库数据备份
- socket10053
热门文章
- 史上最全解读 | 飞桨模型库重大升级,主流算法模型全覆盖
- 人类第一次将42写成3个整数的立方和,最后一个100以内的自然数告破
- 第一家科创板IPO的AI公司:年净利1.58亿,华为小米背后功臣,北大物理系校友创办...
- 成都铁路警方联合多部门开展反恐防暴演练
- 古老的SSM企业级应用
- 如何去掉桌面标签背影
- 搭建前端私有npm杂记
- CDH的几个包的下载地址
- 2013年全球最佳工作
- dev chartcontrol获取x y轴的值_2020年深圳蛇口x情怀当铺展览详情(时间+地点+门票)...