Admin註冊和路由分發詳解
阿新 • • 發佈:2018-06-03
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註冊和路由分發詳解