一 、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),
]

day 82 URL分发的更多相关文章

  1. django url分发,视图,模板回顾

    Django基础轮廓 MTV+controller 一 url分发系统: 1 简单使用 url(r'^articles/2003/$', views.special_case_2003), # spe ...

  2. url分发(二级分发)

    from django.shortcuts import HttpResponsedef test(request): return HttpResponse('test') from django. ...

  3. URL分发(URLConf)

    如果项目中应用太多,都写到顶层的urls.py中,如果个别应用url出问题的话,其他的应用也会受影响,所以我们需要对每个应用下面都写一个urls.py,实现分发 顶层urls.py中写:(属于blog ...

  4. Django路由配置之子路由include(URL分发)

    子路由include(URL分发) 在一个项目中可能存在多个应用,为了方便区分和管理,在项目的总路由urls.py中会进行路由分发: (1)项目总路由导入from  django.conf.urls  ...

  5. day53:django:URL别名/反向解析&URL分发&命名空间&ORM多表操作修改/查询

    目录 1.URL别名&反向解析 2.URL分发&命名空间 3.ORM多表操作-修改 4.ORM多表操作-查询 4.1 基于对象的跨表查询 4.2 基于双下划线的跨表查询 4.3 聚合查 ...

  6. 单例模式及设计url分发

      1.单例模式 2.admin源码解析 3.注册源码流程图 3.admin之url方法的使用 4.admin源码之url设计 5.设计url源码流程 6.总结 1.单例模式 https://www. ...

  7. xadmin系列之django的url分发的方式

    一.先介绍一下我们自己的urls中是如何进行路由分发的 一.一级路由 urlpatterns = [ url(r'^upload/', views.upload,name="upload&q ...

  8. stark组件开发之URL分发和默认Handler

    为register 函数添加一个,prev参数,默认None ,用于可以让用户自己指定前缀. def register(self, model_class, handler_class=None, p ...

  9. url分发、isinstance、request.GET请求之QueryDict和urlencode、post和get请求、limit_choices_to(Model字段)

    这个的路径是怎么来的,是有一个个的url路由分发过来的 这两个是相等的,若url后面加括号了,那么前面就不用这个装饰器了:反之,若装饰器使用了,那么这个url后面就不要加括号了 eg:其他的views ...

随机推荐

  1. [leetcode]117. Populating Next Right Pointers in Each NodeII用next填充同层相邻节点

    Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...

  2. 9-n个人中选k个人的选择方法种类

    用递归法计算从n个人中选择k个人组成一个委员会的不同组合数分析: 1.如果k>n,结果为0 2.k=n时,只有1组 3.k<n的时候,可以把解空间分为两部分:假设其中一个人叫X,那么选X的 ...

  3. yii创建与设置默认控制器并载入模板

    yii创建与设置默认控制器并载入模板 一.创建控制器 在protected下的controllers文件夹中创建自定义的控制器文件,比如: IndexController.php (文件名首字母大写) ...

  4. JFinal开发框架简介

    JFinal 中的Controller Controller是JFinal核心类之一,该类作为MVC模式中的控制器.基于JFinal的Web应用的控制器需要继承该类.Controller是定义Acti ...

  5. .net core web api swagger 配置笔记

    参考网址: --配置步骤见如下链接https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/web-api-help-pages-using-swa ...

  6. ShowMsg函数

    ShowMsg():显示提示信息,跳转到相应页面 例子: ShowMsg(,);

  7. How to Set Up an Rsync Daemon on Your Linux Server

    Introduction This tutorial will take you through setting up an rsync daemon on your Linux server. Yo ...

  8. VC6.0 OpenGL环境配置及编程基础

    1.一般情况下VC并不携带glut,需要到opengl官网下载,下载地址 http://www.opengl.org/resources/libraries/glut/glut37.zip 解压后 打 ...

  9. Spring Boot集成Quartz注入Spring管理的类

    摘要: 在Spring Boot中使用Quartz时,在JOB中一般需要引用Spring管理的Bean,通过定义Job Factory实现自动注入. Spring有自己的Schedule定时任务,在S ...

  10. pyspider示例代码六:传递参数

    传递参数 示例一 #!/usr/bin/env python # -*- encoding: utf- -*- # vim: ts= sts= ff=unix fenc=utf8: # Created ...