1.认识web版admin管理工具
urls:
针对Food表,url:
http://127.0.0.1:8000/admin/app02/food/
http://127.0.0.1:8000/admin/app02/food/add/
http://127.0.0.1:8000/admin/app02/food/1/change/
http://127.0.0.1:8000/admin/app02/food/2/delete/
admin.ModelAdmin:默认配置类
def __str__(self):
return 字符串
配置参数(admin定制):
常用:list_display,list_display_links,list_filter,search_fields,actions
from django.contrib import admin # Register your models here. from app01.models import Book,Publish,Author,AuthorDetail class BookConfig(admin.ModelAdmin): # list_display' must not be a ManyToManyField. list_display=["title","price","publishDate","publish"] list_display_links = ["price","title"] list_filter = ["title","publish","authors"] search_fields = ["title","price"] # 批量操作 def patch_init(self,request,queryset): queryset.update(price=0) patch_init.short_description = "价格初始化" actions =[patch_init] admin.site.register(Book,BookConfig) class PublishConfig(admin.ModelAdmin): list_display = ["name","email"] admin.site.register(Publish,PublishConfig) admin.site.register(Author) admin.site.register(AuthorDetail) print("_registry:-------->",admin.site._registry)
2.单例模式(四种方式)
1)、__new__方式
class Singlon(object): # 利用该静态变量 _instance = None def __new__(cls, *args, **kwargs): if not cls._instance: cls._instance = super(Singlon, cls).__new__(cls, *args, **kwargs) return cls._instance s1 = Singlon() s2 = Singlon() print(id(s1), id(s2))
2)、通过导入模块 导入类的实例
在一个文件import多次,还是在多个文件导入,其实都是一个实例,这样就是单例,其实都是从pyc文件中回去编译对象。
# a.py class Singlon: def __init__(self): self.a = 1 s = Singlon() # b.py from a import s # c.py from a import s
http://www.91ri.org/7735.html
3)、装饰器方式
from functools import wraps def wrapper(cls): instance = {} @wraps(cls) def inner(*args, **kwargs): if cls not in instance: instance[cls] = cls(*args, **kwargs) return instance[cls] return inner @wrapper class Singlon(object): a = 1 s1 = Singlon() s2 = Singlon() print(s1, s2) print(id(s1), id(s2))
4)、元类
class SinglonMeta(type): def __call__(cls, *args, **kwargs): print('元类中的__call__') if not hasattr(cls, '_instance'): cls._instance = super().__call__(cls, *args, **kwargs) """ # 产生类MySinglon的过程就是在调用SinglonMeta,而SinglonMeta也是type类的一个对象, # 那么SinglonMeta之所以可以调用,一定是在元类type中有一个__call__方法 # 该方法中同样需要做至少三件事: # class type: # def __call__(self, *args, **kwargs): #self=<class '__main__.Mymeta'> # obj=self.__new__(self,*args,**kwargs) # 产生Mymeta的一个对象 # self.__init__(obj,*args,**kwargs) # return obj """ return cls._instance class MySinglon(metaclass=SinglonMeta): def __init__(self, *args, **kwargs): print('类对象中的__init__') def __new__(cls, *args, **kwargs): print('类对象中的__new__') return super().__new__(cls) m1 = MySinglon() m2 = MySinglon() print(m1) print(id(m1), id(m2))
3.admin源码分析:
1.启动
django启动后,会加载settings中的install_apps,其中有admin.py文件
admin.py:
from django.contrib.admin.sites import AdminSite, site # site是AdminSite的一个单例
autodiscover_modules('admin', register_to=site):加载每一个app下的admin.py文件
2.注册
admin.site.register(Author) class BookConfig(admin.ModelAdmin): pass admin.site.register(Book,BookConfig) 源码: admin.py---sites.py----> class AdminSite(object): def __init__(self): self._registry = {} def register(self,model,admin_class=None): if not admin_class: admin_class = ModelAdmin self._registry[model] = admin_class(model, self) site = AdminSite()
3.设计urls
4. 预习和扩展
1)、闭包的解释:
https://www.cnblogs.com/Lin-Yi/p/7305364.html