1

day 82 URL分发

一 、admin 流程 

      (1)  启动
           autodiscover_modules('admin', register_to=site)
           
      (2)  注册
           单例模式
           admin.site=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)}
                           
           
           admin.site.register(Book)  #  admin.site._registry={Book:ModelAdmin(Book)}
           admin.site.register(Publish)  #  admin.site._registry={Book:ModelAdmin(Book),Publish:ModelAdmin(Publish)}
           
           class Authoconfig(admin.ModelAdmin):
                pass
                
           admin.site.register(Author,Authoconfig)  #  admin.site._registry={Book:ModelAdmin(Book),Publish:ModelAdmin(Publish),Author:Authoconfig(Author)}
           

 

 

 

二 、设计URL

为每个app下的model设计增删改查4个URL,以book为例。

  127.0.0.1:8000/admin/app01/book/

 

  127.0.0.1:8000/admin/app01/book/add

 

  127.0.0.1:8000/admin/app01/book/1/change/

 

  127.0.0.1:8000/admin/app01/book/1/delete

 

 

 

三 、URL分发

案例 

 

二级路由

from django.conf.urls import url
from django.contrib import admin
from app01 import views
from django.shortcuts import HttpResponse

def test01(request):
    return HttpResponse('TEST01')

def test02(request):
    return HttpResponse('TEST02')

def test03(request):
    return HttpResponse('TEST03')



urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^query/',views.query),

    url('^yuan/',([
        url('^test01/',test01),
        url('^test02/',test02),
        url('^test03/',test03),
            ],None,None))

]

  

 

 

 

 

 

三级路由

def test001(request):
    return HttpResponse('TEST001')

def test002(request):
    return HttpResponse('TEST002')

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^query/',views.query),

    url('^yuan/',([
        url('^test01/',([

            url('^test001/', test001),
            url('^test002/', test002),
        ],None,None)),
        url('^test02/',test02),
        url('^test03/',test03),
            ],None,None))

  

 

 

 

 

 四、URL 注册

需求: 为每个app下的

 

def test002(request):
    return HttpResponse('TEST002')

def get_urls():
    temp =[]
    temp.append(url("app01/book",test002))
    print(temp)
    return temp
    print(temp)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    # url(r'^Xadmin/',([get_urls(),],None,None)),
    url(r'^Xadmin/',(get_urls(),None,None)),
    url(r'^query/',views.query),
    #
    # url('^yuan/',([
    #     url('^test01/',([
    #
    #         url('^test001/', test001),
    #         url('^test002/', test002),
    #     ],None,None)),
    #     url('^test02/',test02),
    #     url('^test03/',test03),
    #         ],None,None))

]

  

结果:

 

第二种方法 。

 

def  list_view(request):
    return HttpResponse('list_view')

def  add_view(request):
    return HttpResponse('add_view')

def  change_view(request):
    return HttpResponse('change_view')

def  delete_view(request):
    return HttpResponse('delete_view')

def get_url2():
    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+)/delete/$',delete_view))

def get_urls():
    print(admin.site._registry)

    temp =[]
    for  model,admin_class_obj in admin.site._registry.items():
        app_name = model.meta.app_label
        model_name = model.meta.model_name

        temp.append(url(r'^{0}/{1}/'.format(app_name,model_name),(get_url2(),None,None)),)
    return temp

类 的名字 如何写:

 

 类的app名字 :

 

 

输出的结果:

 

 

 

 

 五 、URL的分发

 

 


def list_view(request):
return HttpResponse("list_view")


def add_view(request):
return HttpResponse("add_view")


def change_view(request,id):
return HttpResponse("change_view")


def delete_view(request,id):
return HttpResponse("delete_view")



def get_urls_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+)/delete/$",delete_view)) return temp
def get_urls(): print(admin.site._registry) # {Book:modelAdmin(Book),.......} temp=[] for model,admin_class_obj in admin.site._registry.items(): app_name=model._meta.app_label model_name=model._meta.model_name temp.append(url(r'^{0}/{1}/'.format(app_name,model_name), (get_urls_2(),None,None)),) return temp

  

 

 

 

admin 文件

 

 

from django.contrib import admin

# Register your models here.
from .models import *
from django.utils.safestring import mark_safe

class BookConfig(admin.ModelAdmin):

    def deletes(self):
        return mark_safe('<a href =''> 删除</a>')

    list_display = ["title", "price", "publishDate", 'publish', deletes]
    list_display_links = ["price"]
    list_filter = ["price", "title", "authors", "publish"]
    list_editable = ["title", ]

    search_fields = ["title", "price"]

admin.site.register(Book,BookConfig)

print('1====>',admin.site._registry)

admin.site.register(Publish)
admin.site.register(Author)
admin.site.register(AuthorDetail)
print('2====>',admin.site._registry)

  

 

打印出来的结果

 

1====> {<class 'django.contrib.auth.models.Group'>: <django.contrib.auth.admin.GroupAdmin object at 0x00000257050332B0>, <class 'django.contrib.auth.models.User'>: <django.contrib.auth.admin.UserAdmin object at 0x0000025705055CF8>, <class 'app01.models.Book'>: <app01.admin.BookConfig object at 0x000002570506B9B0>}
2====> {<class 'django.contrib.auth.models.Group'>: <django.contrib.auth.admin.GroupAdmin object at 0x00000257050332B0>, <class 'django.contrib.auth.models.User'>: <django.contrib.auth.admin.UserAdmin object at 0x0000025705055CF8>, <class 'app01.models.Book'>: <app01.admin.BookConfig object at 0x000002570506B9B0>, <class 'app01.models.Publish'>: <django.contrib.admin.options.ModelAdmin object at 0x000002570506B978>, <class 'app01.models.Author'>: <django.contrib.admin.options.ModelAdmin object at 0x000002570506BA20>, <class 'app01.models.AuthorDetail'>: <django.contrib.admin.options.ModelAdmin object at 0x000002570506BA58>}

  

 

 

六、自定义Xadmin  之注册

service 目录下的xadmin文件

 

from django.conf.urls import url
from django.shortcuts import HttpResponse,render,redirect
class ModelXadmin(object):
    def __init__(self,model,site):

        self.model=model
        self.site=site

    def list_view(self, request):
        print("self.model",self.model)

        data_list=self.model.objects.all()
        print("data_list",data_list)
        return render(request, 'list_view.html',{"data_list":data_list})

    def add_view(self, request):
        return render(request, 'add_view.html')

    def change_view(self, request, id):
        return render(request, 'change_view.html')

    def delete_view(self, request, id):
        return render(request, 'delete_view.html')

    def get_urls2(self):
        temp = []

        temp.append(url(r"^$", self.list_view))
        temp.append(url(r"^add/$", self.add_view))
        temp.append(url(r"^(\d+)/change/$", self.change_view))
        temp.append(url(r"^(\d+)/delete/$", self.delete_view))

        return temp

    @property
    def urls2(self):
        return self.get_urls2(), None, None


class XadminSite(object):
    def __init__(self, name='admin'):
        self._registry = {}


    def get_urls(self):

        print(self._registry)  # {Book:modelAdmin(Book),.......}

        temp = []
        for model, admin_class_obj in self._registry.items():
            app_name = model._meta.app_label
            model_name = model._meta.model_name

            temp.append(url(r'^{0}/{1}/'.format(app_name, model_name), admin_class_obj.urls2), )


            '''
            url(r"app01/book",ModelXadmin(Book,site).urls2)
            url(r"app01/publish",ModelXadmin(Publish,site).urls2)
            url(r"app02/order",ModelXadmin(Order,site).urls2)
            
            '''
        return temp

    @property
    def urls(self):

        return self.get_urls(),None,None

    def register(self, model, admin_class=None, **options):
        if not admin_class:
                 admin_class = ModelXadmin

        self._registry[model] = admin_class(model, self) # {Book:ModelAdmin(Book),Publish:ModelAdmin(Publish)}

site=XadminSite()

  

app01 下的xadmin文件

 

from django.contrib import admin

# Register your models here.


from Xadmin.service.Xadmin import site,ModelXadmin

print("app01 Xadmin")

from app01.models import *

class BookConfig(ModelXadmin):
    list_display=["title","prcie"]

site.register(Book,BookConfig)


class BookConfig(ModelXadmin):
    list_display=["name"]
site.register(Publish,BookConfig)



site.register(Author)
site.register(AuthorDetail)

  app02 下的xadmin文件

 

 

from Xadmin.service.Xadmin import site

from app02.models import *

site.register(Order)
site.register(Food)

print("_registry",site._registry)

  

 

views文件

from django.conf.urls import url
from django.contrib import admin


from Xadmin.service.Xadmin import site
urlpatterns = [
    url(r'^admin/',  admin.site.urls),
    url(r'^Xadmin/', site.urls),
]

 

posted @ 2018-06-02 20:25  萌哥-爱学习  阅读(230)  评论(0编辑  收藏  举报