零、预备知识 单例对象
方式一:__new__方法
方式二:模块导入,只要在引入的文件中实例了这个对象,不管引道哪里,这个对象都指向同一个内存空间
1 class My_singleton(object): 2 def foo(self): 3 print("ok") 4 5 my_singleton = My_singleton()
from xxx import my_singleton my_singleton.foo()
一、Xadmin之注册与生成url
在Xadmin.apps中:
1 from django.apps import AppConfig 2 from django.utils.module_loading import autodiscover_modules 3 4 class XadminConfig(AppConfig): 5 name = 'Xadmin' 6 7 def ready(self): #调用这个类时自动执行 8 autodiscover_modules('Xadmin') #从admin.py文件中复制,读取每个app中Xadmin.py文件
在Xadmin.py中:
1 from django.conf.urls import re_path 2 from django.shortcuts import HttpResponse 3 4 5 class ModelXadmin(object): 6 def __init__(self,model,site): 7 self.model = model 8 self.site = site 9 10 def list_view(self,request): #查询界面 11 return HttpResponse("list_view") 12 def add_view(self,request): #增加界面 13 return HttpResponse("add_view") 14 def change_view(self,request,id): #修改界面 15 return HttpResponse("change_view") 16 def delete_view(self,request,id): #删除界面 17 return HttpResponse("delete_view") 18 19 @property 20 def urls(self): 21 temp = [] 22 23 temp.append(re_path(r'^$',self.list_view)) 24 temp.append(re_path(r'^add/$',self.add_view)) 25 temp.append(re_path(r'^(\d+)/delete/$',self.delete_view)) 26 temp.append(re_path(r'^(\d+)/change/$',self.change_view)) 27 28 return temp,None,None 29 30 31 class XadminSite(object): 32 def __init__(self): 33 self._registry = {} 34 35 def register(self,model,Xadmin_class=None,**options): 36 if not Xadmin_class: 37 Xadmin_class = ModelXadmin 38 self._registry[model] = Xadmin_class(model,self) #{Book:ModelXadmin(Book)} 39 40 @property 41 def urls(self): 42 43 temp = [] 44 45 for model,Xadmin_class in self._registry.items(): 46 app_name = model._meta.app_label #取相应app的名字 47 model_name = model._meta.model_name #取相应model的名字 48 49 temp.append(re_path(r'^{0}/{1}/'.format(app_name,model_name),Xadmin_class.urls))# 50 51 return temp,None,None 52 53 54 site = XadminSite() #创建单例对象
在app的Xadmin.py中:
1 from Xadmin.service import Xadmin 2 from app02 import models 3 4 Xadmin.site.register(models.Food) 5 Xadmin.site.register(models.Order)