zoukankan      html  css  js  c++  java
  • 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

      

  • 相关阅读:
    webkit浏览器常见开发问题
    解密H264、AAC硬件解码的关键扩展数据处理
    Bitmap那些事之内存占用计算和加载注意事项
    android apk 防止反编译技术第三篇-加密
    linux设备驱动第五篇:驱动中的并发与竟态
    如何简单快速调试高大上的谷歌浏览器
    Asp.net Mvc对比Php的4大误解
    Python初学记录
    SQL循环+游标
    Nico Game Studio 3.地图纹理编辑 物体皮肤编辑
  • 原文地址:https://www.cnblogs.com/wuchenggong/p/9542177.html
Copyright © 2011-2022 走看看