1. 程式人生 > >Admin註冊和路由分發詳解

Admin註冊和路由分發詳解

span upa 一級路由 詳解 st2 RM copy publish 進入

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 admin
1.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。ModelAdmin
class Authoconfig(admin.ModelAdmin):pass
admin.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

 
 
 


 
 
 
 
 

Admin註冊和路由分發詳解