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()) ]
注册的自定义配置
解析:
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 管理工具