bbs-admin
目錄
引入單例----單例補(bǔ)充
admin---url/注冊(cè)的自定義配置
解析admin源碼
?
?
django-admin注冊(cè)賬號(hào)-----創(chuàng)建超級(jí)用戶
python manage.py createsuperuser
引入單例----單例補(bǔ)充
類知識(shí)補(bǔ)充
from django.test import TestCase# Create your tests here.class A(object):x = 12def __init__(self):self.y = 10class B(A):x = 20y = 20b = B() print(b.x) print(b.y)結(jié)果: 20 10類的取值順序
先從對(duì)象的空間取----》對(duì)象所在的類-----》對(duì)象所在的類的父類
幾種單例模式
1 基于__new__
class A():def __new__(cls, *args, **kwargs):_instance = Noneif not _instance:cls._instance = super().__new__(cls,*args,**kwargs)return cls._instancea = A() b = A() c = A() print(id(a)) print(id(b))?解析:1 在實(shí)例化對(duì)象過(guò)程中先進(jìn)行__new__方法,然后把結(jié)果返回給__init__
2 利用第一次,初始化對(duì)象繼承父類的__new__方法,生成的對(duì)象,返回給__init__,然后下次,直接把第一次生成的對(duì)象再返回給__init__,保證始終是第一次生成的對(duì)象
2 基于模塊(python獨(dú)有的)
# 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))# 執(zhí)行代碼 import test_modleprint(id(test_modle.a))import test_modleprint(id(test_modle.a))from test_03 import func func()結(jié)果: 3082181927824 3082181927824 3082181927824 3082181927824解析:
1 導(dǎo)入模塊,會(huì)生成一個(gè)pyc文件,但只會(huì)在第一次生成一個(gè)。后面的數(shù)據(jù)會(huì)從pyc文件中獲取,與導(dǎo)入多少相同模塊無(wú)關(guān)
2 可以把jiango項(xiàng)目看成一個(gè)程序,如果取一個(gè)值,如果改值在同一個(gè)pyc文件中,無(wú)論取值過(guò)程中經(jīng)歷多少個(gè)模塊,都可以看成,直接從相同的pyc文件中取值。
admin---url/注冊(cè)的自定義配置
url-----對(duì)應(yīng)源碼分析url設(shè)計(jì)
二級(jí)路由設(shè)置
設(shè)計(jì)規(guī)則:在urls.py文件中的?urlpatterns 中
url(r'路由',[],None,None)
解析:[]中存放下一級(jí)路由,即url(r'下一級(jí)路由',自定義視圖函數(shù)名)
? ?第一個(gè)None
? ?第二個(gè)None
多級(jí)路由以此類推
參考示例:
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中增刪改查對(duì)應(yīng)的url
增http://127.0.0.1:8000/admin/app01/author/add/刪urlhttp://127.0.0.1:8000/admin/app01/author/1/delete/改urlhttp://127.0.0.1:8000/admin/app01/author/1/change/查urlhttp://127.0.0.1:8000/admin/app01/author/模仿admin簡(jiǎn)單設(shè)計(jì)(初級(jí)版):
設(shè)計(jì)前知識(shí)補(bǔ)充:
model._meta.app_label:獲取類對(duì)象所在的app名
model._meta.model_name:獲取類對(duì)象所在的類名
model:類
config_obj:配置類對(duì)象對(duì)象
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, Nonedef 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, Noneurlpatterns = [# 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注冊(cè)的自定義配置
解析:
1 ?原來(lái),注冊(cè)時(shí),我們通常默認(rèn)繼承?ModelAdmin類,然后在前端顯示
2? 我們通過(guò)繼承ModelAdmin類,覆蓋類中的方法,實(shí)現(xiàn)自定義效果
使用方法
?
class BookConfig(admin.ModelAdmin):list_display = ['title','price','publish','authors'] admin.site.register(Book,BookConfig)?1??list_display = ['title','price','publish','authors']-----將modles.py中的對(duì)應(yīng)表中的字段,展示在admin查的頁(yè)面中
效果展示
默認(rèn)
?
自定義
?
?坑:
1 list_display 中有多對(duì)多/一對(duì)多中的多的字段,會(huì)報(bào)錯(cuò)
ERRORS: <class 'app01.admin.BookConfig'>: (admin.E109) The value of 'list_display[3]' must not be a ManyToManyField.2 ‘hehe’ 等一點(diǎn)都不相干的字段,啟動(dòng)項(xiàng)目就報(bào)錯(cuò)
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 即使兩張表中是一對(duì)多/多對(duì)多/一對(duì)一 只要該表中沒有這個(gè)靜態(tài)書籍,就不能隨便添加,否則,可以正常啟動(dòng),但跳轉(zhuǎn)到相應(yīng)的web時(shí)會(huì)報(bào)錯(cuò)
頁(yè)面 AttributeError at /admin/app01/author/ 'Author' object has no attribute 'book'后臺(tái) AttributeError: 'Author' object has no attribute 'book'2?list_display_links = ['price','title']? ----給對(duì)應(yīng)的字段添加a標(biāo)簽,跳轉(zhuǎn)到修改的url
展示
默認(rèn) 第一個(gè)字段
自定義
3??list_filter = ['title','author','publish']------分類
展示?
默認(rèn)
自定義?
4?search_fields = ['title','price']-----查詢,支持模糊查詢
展示
默認(rèn)
無(wú)
自定義
5 批量操作
1 def patch_init(self,request,queryset):queryset.update(price=0)2 patch_init.short_description = "初始化價(jià)格"3 actions = [patch_init]1 定義函數(shù)(操作數(shù)據(jù)庫(kù))
2 定義選項(xiàng)名稱
3 添加函數(shù)名
展示
?
解析admin源碼
1 啟動(dòng)
從settings.py文件中找到?INSTALLED_APPS 配置文件
又找到admin? ??from django.contrib import admin
?
?
在admin中找到?from django.contrib.admin.sites import AdminSite, site
找到setes模塊? 中的AdminSite, site 初始化對(duì)象site
在admin中找到
def autodiscover():autodiscover_modules('admin', register_to=site)從模塊中掃描帶有admin的文件
找到app01下的admin
2 注冊(cè)
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設(shè)計(jì)
?
參考文檔:Django-admin 管理工具
自定義配置參考詳細(xì)
轉(zhuǎn)載于:https://www.cnblogs.com/benson321/p/9543867.html
總結(jié)
- 上一篇: 微信公众号点击菜单即可打开并登录微站的实
- 下一篇: 分布式面试题(含解答)