Django-admin管理工具

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)
常用admin定制参数

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))
__new__方式

  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

  

原文地址:https://www.cnblogs.com/wuchenggong/p/9542177.html