一 、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. ROS学习笔记二(创建ROS软件包)

    catkin软件包的组成 一个软件包必须满足如下条件才能被称之为catkin软件包: 必须包含一个catkin编译文件package.xml(manifests文件),此文件包含了描述该软件包的重要信 ...

  2. SSH三大框架需要的jar包

    1. Struts2框架 * struts-2.3.24\apps\struts2-blank\WEB-INF\lib\*.jar -- Struts2需要的所有jar包 * struts2-spri ...

  3. socket编程介绍

    Python 提供了两个基本的 socket 模块. 第一个是 Socket,它提供了标准的 BSD Sockets API. 第二个是 SocketServer, 它提供了服务器中心类,可以简化网络 ...

  4. 为什么二代测序的原始数据中会出现Read重复现象?

    为什么二代测序的原始数据中会出现Read重复现象? 要搞清楚这个read重复(duplicate)的问题,我想我们需要从NGS数据的产出过程说起,具体来说如下: 基因组DNA提取: DNA随机打断,最 ...

  5. Linux sudo 错误:XXX is not in the sudoers file 解决办法

    最近在学习linux,在某个用户(xxx)下使用sudo的时候,提示以下错误:xxx is not in the sudoers file. This incident will be reporte ...

  6. adb占用

    输入netstat -ano | findstr "5037" .然后会弹出提示告诉你哪些进程占用了该端口,记住非0地址的后面的数字 打开任务管理器,点击“进程“,“查看”-“选择 ...

  7. 主频3.0 1g内存是什么意思

    我会讲解一些常用的计算机应用知识.希望大家多多支持,稍后更新,我的技术水平在国内属于顶尖的水平,不服来战...稍后更新...

  8. kafka系列 -- 多线程消费者实现

    看了一下kafka,然后写了消费Kafka数据的代码.感觉自己功力还是不够. 不能随心所欲地操作数据,数据结构没学好,spark的RDD操作没学好. 不能很好地组织代码结构,设计模式没学好,面向对象思 ...

  9. KBMMW 4.81.00 发布

    这次更新的速度非常快. 4.81.00 May 9 2015 Important notes (changes that may break existing code) ============== ...

  10. 2018.09.28 牛客网contest/197/B面积并(二分+简单计算几何)

    传送门 比赛的时候把题目看成求面积交了,一直没调出来. 下来发现是面积并气的吐血. 码了一波发现要开long double. 然而直接用现成的三角函数会挂. 因此需要自己手写二分求角度. 大致思路就是 ...