zoukankan      html  css  js  c++  java
  • bbs-admin

    目录

    引入单例----单例补充

    admin---url/注册的自定义配置

    解析admin源码

     

    django-admin注册账号-----创建超级用户

    python manage.py createsuperuser

    引入单例----单例补充

    类知识补充

    from django.test import TestCase
    
    # Create your tests here.
    
    
    class A(object):
        x = 12
        def __init__(self):
            self.y = 10
    
    
    class B(A):
        x = 20
        y = 20
    
    
    b = B()
    print(b.x)
    print(b.y)
    
    结果:
    20
    10

    类的取值顺序

      先从对象的空间取----》对象所在的类-----》对象所在的类的父类

    几种单例模式

    1 基于__new__

    class A():
        def __new__(cls, *args, **kwargs):
            _instance = None
            if not _instance:
                cls._instance = super().__new__(cls,*args,**kwargs)
            return cls._instance
        
    
    a = A()
    b = A()
    c = A()
    print(id(a))
    print(id(b))

     解析:1 在实例化对象过程中先进行__new__方法,然后把结果返回给__init__

        2 利用第一次,初始化对象继承父类的__new__方法,生成的对象,返回给__init__,然后下次,直接把第一次生成的对象再返回给__init__,保证始终是第一次生成的对象

    2 基于模块(python独有的)

    # test_modle模块
    class A():
        def __init__(self):
            self.name = 'alex'
        def func(self):
            print('呵呵')
    
    a = A()
    print(id(a))
    
    # test_03
    import test_modle
    def func():
        print(id(test_modle.a))
    
    
    
    # 执行代码
    import test_modle
    
    print(id(test_modle.a))
    
    import test_modle
    
    print(id(test_modle.a))
    
    from test_03 import func
    func()
    
    
    结果:
    3082181927824
    3082181927824
    3082181927824
    3082181927824

    解析:

      1 导入模块,会生成一个pyc文件,但只会在第一次生成一个。后面的数据会从pyc文件中获取,与导入多少相同模块无关

      

      2 可以把jiango项目看成一个程序,如果取一个值,如果改值在同一个pyc文件中,无论取值过程中经历多少个模块,都可以看成,直接从相同的pyc文件中取值。

    admin---url/注册的自定义配置

    url-----对应源码分析url设计

    二级路由设置

    设计规则:在urls.py文件中的 urlpatterns 中

    url(r'路由',[],None,None)

    解析:[]中存放下一级路由,即url(r'下一级路由',自定义视图函数名)

         第一个None

         第二个None

    多级路由以此类推

    参考示例

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
    
        url(r'index',([
                url(r'^$',index),
                url(r'test01',test01),
                url(r'test02',test02)
                      ],None,None))
        # url(r'index/', get_urls())
    ]

    admin中增删改查对应的url

    增
    
    http://127.0.0.1:8000/admin/app01/author/add/
    
    删url
    
    http://127.0.0.1:8000/admin/app01/author/1/delete/
    
    改url
    
    http://127.0.0.1:8000/admin/app01/author/1/change/
    
    查url
    
    http://127.0.0.1:8000/admin/app01/author/

    模仿admin简单设计(初级版):

    设计前知识补充:

    model._meta.app_label:获取类对象所在的app名

    model._meta.model_name:获取类对象所在的类名

    model:类

    config_obj:配置类对象对象

    from django.conf.urls import url
    from django.contrib import admin
    from django.shortcuts import HttpResponse
    def test01(request):
        return HttpResponse('test01')
    def test02(request):
        return HttpResponse('test02')
    def index(request):
        return HttpResponse('index')
    def show(request):
        return HttpResponse('show')
    def add(request):
        return HttpResponse('add')
    def change(request,id):
        return HttpResponse('change')
    def delete(request,id):
        return HttpResponse('delete')
    def get_urls2():
        item = [
            url(r'^$',show),
            url(r'add/', add),
            url(r'(d+)/change',change),
            url(r'(d+)/delete', delete)
        ]
        return item, None, None
    
    def get_urls():
        item=[url(r'^$',index)]
        for model,config in admin.site._registry.items():
            # print('----->',model,config)
            urls = url(r'{}/{}/'.format(model._meta.app_label,model._meta.model_name),get_urls2())
            item.append(urls)
        return item, None, None
    
    urlpatterns = [
        # url(r'^admin/', admin.site.urls),
        # 
        # url(r'index',([
        #         url(r'^$',index),
        #         url(r'test01',test01),
        #         url(r'test02',test02)
        #               ],None,None))
        url(r'index/', get_urls())
    ]
    View Code

    注册的自定义配置

    解析:

    1  原来,注册时,我们通常默认继承 ModelAdmin类,然后在前端显示

    2  我们通过继承ModelAdmin类,覆盖类中的方法,实现自定义效果

    使用方法

    class BookConfig(admin.ModelAdmin):
        list_display = ['title','price','publish','authors']
    admin.site.register(Book,BookConfig)

     1  list_display = ['title','price','publish','authors']-----将modles.py中的对应表中的字段,展示在admin查的页面中

    效果展示

    默认

    自定义

     坑:

      1 list_display 中有多对多/一对多中的多的字段,会报错

    ERRORS:
    <class 'app01.admin.BookConfig'>: (admin.E109) The value of 'list_display[3]' must not be a ManyToManyField.

      2 ‘hehe’ 等一点都不相干的字段,启动项目就报错

    ERRORS:
    <class 'app01.admin.BookConfig'>: 
    (admin.E108) The value of 'list_display[3]' refers to 'hehe',
    which is not a callable, an attribute of 'BookConfig', or an attribute or method on 'app01.Book'.
    class PublishConfig(admin.ModelAdmin):
        list_display = ['name','hehe']
    admin.site.register(Publish)
    admin.site.register(AuthorDetail,PublishConfig)

      3 即使两张表中是一对多/多对多/一对一 只要该表中没有这个静态书籍,就不能随便添加,否则,可以正常启动,但跳转到相应的web时会报错

    页面
    AttributeError at /admin/app01/author/
    'Author' object has no attribute 'book'
    
    后台
    AttributeError: 'Author' object has no attribute 'book'

    2 list_display_links = ['price','title']  ----给对应的字段添加a标签,跳转到修改的url

    展示

    默认 第一个字段

    自定义

    3  list_filter = ['title','author','publish']------分类

    展示 

    默认

    自定义 

    4 search_fields = ['title','price']-----查询,支持模糊查询

    展示

    默认

    自定义

    5 批量操作

       1 def patch_init(self,request,queryset):
            queryset.update(price=0)
       2 patch_init.short_description = "初始化价格"
       3 actions = [patch_init]

    1 定义函数(操作数据库)

    2 定义选项名称

    3 添加函数名

    展示

      

    解析admin源码

      1 启动

        从settings.py文件中找到 INSTALLED_APPS 配置文件

        又找到admin    from django.contrib import admin

        在admin中找到 from django.contrib.admin.sites import AdminSite, site

        找到setes模块  中的AdminSite, site 初始化对象site

        

        在admin中找到

    def autodiscover():
        autodiscover_modules('admin', register_to=site)

        从模块中扫描带有admin的文件

        找到app01下的admin

      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设计

       

    参考文档:Django-admin 管理工具

         自定义配置参考详细

  • 相关阅读:
    七牛php-sdk使用
    七牛php-sdk使用-多媒体处理
    七牛php-sdk使用-文档处理
    七牛php-sdk使用-文件上传
    php爬取微信文章内容
    php解决微信文章图片防盗链
    python2.7编译安装升级python3并安装Scrapy
    centos7安装配置supervisor守护进程
    vuejs+thinkphp5+phpsocketIO+timer数据及时更新
    docker常用命令
  • 原文地址:https://www.cnblogs.com/benson321/p/9543867.html
Copyright © 2011-2022 走看看