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 = ModelAdmin
    self._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 = model
        self.opts = model._meta
        self.admin_site = admin_site
        super(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>}
‘‘‘

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("这是删除的网页")

 
 
 

 
 
 
 
 

原文地址:https://www.cnblogs.com/zgf-666/p/9129683.html

时间: 2024-08-30 11:48:39

Admin注册和路由分发详解的相关文章

springCloud(14):使用Zuul构建微服务网关-路由端点与路由配置详解

一.Zuul的路由端点 当@EnableZuulProxy与SpringBoot Actuator配合使用时,Zuul会暴露一个路由管理端点/routes.借助这个端点,可以方便.直观地查看以及管理Zuul的路由. /routes端点的使用非常简单,使用GET方法访问该端点,即可返回Zuul当前映射的路由列表:使用POST方法访问该端点就会强制刷新Zuul当前映射的路由列表(尽管路由会自动刷新,Spring Cloud依然提供了强制立即刷新的方式). 由于spring-cloud-starter

ThinkPHP URL 路由功能详解与实例

本节内容导读 本节内容主要介绍 ThinkPHP 路由功能与 U方法的使用,分为下面几个部分: ThinkPHP URL 路由功能详解:见本页下面文字 ThinkPHP 正则路由与实例 ThinkPHP U方法:使用U方法自动生成URL超链接 ThinkPHP 3.0 版本的路由功能较 2.x 版本有较大的变更,如果您的版本是 2.x,请参阅下面的文档: ThinkPHP 2.0 URL 路由(2.0版本适用) ThinkPHP 泛路由使用详解(2.0版本适用) ThinkPHP 2.1 路由规

Android Touch事件分发详解

Android Touch事件分发详解 先说一些基本的知识,方便后面分析源码时能更好理解. - 所有Touch事件都被封装成MotionEvent对象,包括Touch的位置.历史记录.第几个手指等. 事件类型分为ACTION_DOWN,ACTION_UP,ACTION_MOVE,ACTION_POINTER_DOWN,ACTION_POINTER_UP,ACTION_CANCEL, 每个 一个完整的事件以ACTION_DOWN开始ACTION_UP结束,并且ACTION_CANCEL只能由代码引

EIGRP汇总后生成的Null0接口和路由黑洞详解

提到Null0接口,就顺便提一下路由黑洞.所谓黑洞路由,顾名思义他就是将所有无关路由吸入其中,使它们有来无回的路由 - 相当于洪水来临时,在洪水途经的路上附近挖一个不见底的巨大深坑,然后将洪水引入其中. 黑洞路由实际是一种特殊的静态路由,就是目的地址为该网段的数据报文到达设备之后,报文将被丢弃.路由黑洞最大的好处是充分利用了路由器的3层数据包转发能力,对系统负载影响非常小,将报文丢弃的操作不需要CPU进行什么专门的处理,所以处理大量的报文也不会消耗设备的CPU资源! 例如,admin建立一个路由

ASP.NET MVC5 新特性:Attribute路由使用详解

1.什么是Attribute路由?怎么样启用Attribute路由? 微软在 ASP.NET MVC5 中引入了一种新型路由:Attribute路由,顾名思义,Attribute路由是通过Attribute来定义路由.当然,MVC5也支持以前定义路由的方式,你可以在一个项目中混合使用这两种方式来定义路由. 在以前的版本中我们通常在 RouteConfig.cs 文件中通过以下方式来定义路由: routes.MapRoute( name: "ProductPage", url: &quo

ASP.NET MVC5 新特性:Attribute路由使用详解 (转载)

1.什么是Attribute路由?怎么样启用Attribute路由? 微软在 ASP.NET MVC5 中引入了一种新型路由:Attribute路由,顾名思义,Attribute路由是通过Attribute来定义路由.当然,MVC5也支持以前定义路由的方式,你可以在一个项目中混合使用这两种方式来定义路由. 在以前的版本中我们通常在 RouteConfig.cs 文件中通过以下方式来定义路由: routes.MapRoute( name: "ProductPage", url: &quo

Android系统输入事件分发详解

什么是输入事件? 我们知道,运行android系统的设备本质上是一台计算机,使用者在和计算机进行交互的时候可以抽象成简单的对计算机的输入和输出(IO).那么对于运行在计算机上的操作系统来说,操作系统在与使用者进行交互的时候起始也是可以抽象成对外界的输入进行处理,然后在输出返还给使用者.本文只讨论的是android系统中的"输入事件"(因为本文讨论的都是输入事件,所以以下简称"输入事件"为"事件")相关的内容. 根据以上描述,我们就可以回答上面的问

ASP.NET MVC5 :Attribute路由使用详解

1.什么是Attribute路由?怎么样启用Attribute路由? 微软在 ASP.NET MVC5 中引入了一种新型路由:Attribute路由,顾名思义,Attribute路由是通过Attribute来定义路由.当然,MVC5也支持以前定义路由的方式,你可以在一个项目中混合使用这两种方式来定义路由. 在以前的版本中我们通常在 RouteConfig.cs 文件中通过以下方式来定义路由: routes.MapRoute( name: "ProductPage", url: &quo

华为路由器——BGP路由技术详解

BGP(边界网关协议)是一个路径矢量路由协议,和传统的基于下一跳的IGP协议不同,它是基于AS(自治系统)的协议.BGP属于外部网关路由协议,它解决的是AS之间的选路问题,也正是因为这样,它更适合用户互联网.学习BGP的关键在于理解BGP的报文.邻居的建立.BGP路由属性.选路原则等.接下来详细介绍--BGP路由协议. 博文大纲:一.了解BGP的概述:二.掌握BGP的工作原理:三.实验案例:四.总结BGP的配置: 一.BGP的概述 不同于RIP.OSPF之类的路由协议,BGP是在自治系统之间进行