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),
]
day 82 URL分发的更多相关文章
- django url分发,视图,模板回顾
Django基础轮廓 MTV+controller 一 url分发系统: 1 简单使用 url(r'^articles/2003/$', views.special_case_2003), # spe ...
- url分发(二级分发)
from django.shortcuts import HttpResponsedef test(request): return HttpResponse('test') from django. ...
- URL分发(URLConf)
如果项目中应用太多,都写到顶层的urls.py中,如果个别应用url出问题的话,其他的应用也会受影响,所以我们需要对每个应用下面都写一个urls.py,实现分发 顶层urls.py中写:(属于blog ...
- Django路由配置之子路由include(URL分发)
子路由include(URL分发) 在一个项目中可能存在多个应用,为了方便区分和管理,在项目的总路由urls.py中会进行路由分发: (1)项目总路由导入from django.conf.urls ...
- day53:django:URL别名/反向解析&URL分发&命名空间&ORM多表操作修改/查询
目录 1.URL别名&反向解析 2.URL分发&命名空间 3.ORM多表操作-修改 4.ORM多表操作-查询 4.1 基于对象的跨表查询 4.2 基于双下划线的跨表查询 4.3 聚合查 ...
- 单例模式及设计url分发
1.单例模式 2.admin源码解析 3.注册源码流程图 3.admin之url方法的使用 4.admin源码之url设计 5.设计url源码流程 6.总结 1.单例模式 https://www. ...
- xadmin系列之django的url分发的方式
一.先介绍一下我们自己的urls中是如何进行路由分发的 一.一级路由 urlpatterns = [ url(r'^upload/', views.upload,name="upload&q ...
- stark组件开发之URL分发和默认Handler
为register 函数添加一个,prev参数,默认None ,用于可以让用户自己指定前缀. def register(self, model_class, handler_class=None, p ...
- url分发、isinstance、request.GET请求之QueryDict和urlencode、post和get请求、limit_choices_to(Model字段)
这个的路径是怎么来的,是有一个个的url路由分发过来的 这两个是相等的,若url后面加括号了,那么前面就不用这个装饰器了:反之,若装饰器使用了,那么这个url后面就不要加括号了 eg:其他的views ...
随机推荐
- iOS.Compiler
1. 在Xcode4.6下创建的工程, 在Xcode5下build&run, 然后提示以下error. 难不成要在Xcode5下重新创建工程? Xcode cannot run using t ...
- python使用input()来接受字符串时一直报错“xxx is not defined”
报错信息: “Please input your guess: gussTraceback (most recent call last): File "coinGuessGame.py& ...
- composer install 时,提示:Package yiisoft/yii2-codeception is abandoned, you should avoid using it. Use codeception/codeception instead.的解决
由 SHUIJINGWAN · 2017/11/24 1.composer install 时,提示:Package yiisoft/yii2-codeception is abandoned, yo ...
- paxos 分布一致性算法的一些资料
http://blog.csdn.net/russell_tao/article/details/7238783 技术牛人博客 三国背景来讲述分布一致性算法 此人还是NGINX的代码解析 <深入 ...
- 《JavaScript高级程序设计》笔记
1. 当在函数内部定义了其他函数时,就创建了闭包.闭包有权访问包含函数内部的所有变量. 2. 闭包可以分隔变量空间,不会占用全局空间而造成相互间的干拢.使用闭包可以在JavaScript中模仿块级作用 ...
- display:grid
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Android 在一个程序中启动另一个程序(包名,或者类名)
http://hi.baidu.com/xiaofanqing/item/6fd724f7c5bb6dce531c26b7 Android 开发有时需要在一个应用中启动另一个应用,比如Launcher ...
- 第九章:叹词(L'interjection )
➊叹词的使用词类 .拟声词.如: Ah !啊!呀!哎! Hein !嗯!呣!哎! Paf !啪!叭! Pouf !扑通(重物坠地声) Euh ...
- b3_trcd_EDCD_new
# -*- coding:utf-8 -*- import re year="17A" ss='./data/' filename = ss+'EDCD%s.txt'%year ' ...
- jmap的几个操作要慎用
JDK中带有了一堆的工具是可以用来查看运行状况,排查问题的,但对于这些工具还是要比较清楚执行后会发生什么,否则有可能会因为执行了一个命令就导致严重故障,重点讲下影响比较大的jmap. 最主要的危险操作 ...