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 ...
随机推荐
- [leetcode]117. Populating Next Right Pointers in Each NodeII用next填充同层相邻节点
Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *nex ...
- 9-n个人中选k个人的选择方法种类
用递归法计算从n个人中选择k个人组成一个委员会的不同组合数分析: 1.如果k>n,结果为0 2.k=n时,只有1组 3.k<n的时候,可以把解空间分为两部分:假设其中一个人叫X,那么选X的 ...
- yii创建与设置默认控制器并载入模板
yii创建与设置默认控制器并载入模板 一.创建控制器 在protected下的controllers文件夹中创建自定义的控制器文件,比如: IndexController.php (文件名首字母大写) ...
- JFinal开发框架简介
JFinal 中的Controller Controller是JFinal核心类之一,该类作为MVC模式中的控制器.基于JFinal的Web应用的控制器需要继承该类.Controller是定义Acti ...
- .net core web api swagger 配置笔记
参考网址: --配置步骤见如下链接https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/web-api-help-pages-using-swa ...
- ShowMsg函数
ShowMsg():显示提示信息,跳转到相应页面 例子: ShowMsg(,);
- 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 ...
- VC6.0 OpenGL环境配置及编程基础
1.一般情况下VC并不携带glut,需要到opengl官网下载,下载地址 http://www.opengl.org/resources/libraries/glut/glut37.zip 解压后 打 ...
- Spring Boot集成Quartz注入Spring管理的类
摘要: 在Spring Boot中使用Quartz时,在JOB中一般需要引用Spring管理的Bean,通过定义Job Factory实现自动注入. Spring有自己的Schedule定时任务,在S ...
- pyspider示例代码六:传递参数
传递参数 示例一 #!/usr/bin/env python # -*- encoding: utf- -*- # vim: ts= sts= ff=unix fenc=utf8: # Created ...