django admin組件使用方法詳解
關(guān)于admin:
(1) admin的概述:
admin是一個django子代的組件,當(dāng)創(chuàng)建一個項(xiàng)目會后,就會在settings文件的 INSTALLED_APPS 中自動注冊,另外在urls.py 文件中同樣存在admin的路由
INSTALLED_APPS = [ #自帶并且注冊的一個組件即app 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes',
urlpatterns = [ # 自動存在的admin路由 url(r'^admin/', admin.site.urls), url(r'^stark/', site.urls), ]
(2) admin 的執(zhí)行流程
當(dāng)django程序加載的時候,自動循環(huán)加載已經(jīng)注冊的APP中的admin.py文件然后執(zhí)行
#在admin.py文件中有一個__init__文件 ,其中有代碼如下 #意思是:程序的啟動自動尋找名為admin的py文件,然后執(zhí)行 def autodiscover(): autodiscover_modules('admin', register_to=site)
#具體的方法如下: def autodiscover_modules(*args, **kwargs): """ Auto-discover INSTALLED_APPS modules and fail silently when not present. This forces an import on them to register any admin bits they may want. You may provide a register_to keyword parameter as a way to access a registry. This register_to object must have a _registry instance variable to access it. """
執(zhí)行admin.py文件中的內(nèi)容
# 在django啟動時候,系統(tǒng)自動加載 from django.contrib import admin #導(dǎo)入該APP下的models from DRF import models #此處是一個單例模式 admion.site admin.site.register(models.Publisher)
單例模式site 這里應(yīng)用的是一個單例模式,對于AdminSite類的一個單例模式,執(zhí)行的每一個App中的每一個admin.site都是一個對象
# AdminSite 類 class AdminSite(object): ... def __init__(self, name='admin'): self._registry = {} # model_class class -> admin_class instance self.name = name self._actions = {'delete_selected': actions.delete_selected} self._global_actions = self._actions.copy() all_sites.add(self) .... site = AdminSite()
執(zhí)行register方法
# AdminSite中的register 方法 def register(self, model_or_iterable, admin_class=None, **options): """ Registers the given model(s) with the given admin class. The model(s) should be Model classes, not instances. If an admin class isn't given, it will use ModelAdmin (the default admin options). If keyword arguments are given -- e.g., list_display -- they'll be applied as options to the admin class. If a model is already registered, this will raise AlreadyRegistered. If a model is abstract, this will raise ImproperlyConfigured. """
知識補(bǔ)充: 單例模式
a.py
class AdminSite(object): def __init__(self): self._registry = {} obj1 = AdminSite()
b.py
import a a.obj1._registry['k2'] = 666
c.py
import a a.obj1._registry['k1'] = 123 print(a.obj1._registry)
單例模式的實(shí)現(xiàn)方法
1:使用模塊
Python的模塊就是天然的單例模式。
因?yàn)槟K在第一次導(dǎo)入時,會生成 .pyc 文件,當(dāng)?shù)诙螌?dǎo)入時,就會直接加載 .pyc 文件,而不會再次執(zhí)行模塊代碼。
因此,我們只需把相關(guān)的函數(shù)和數(shù)據(jù)定義在一個模塊中,就可以獲得一個單例對象了。
例如:
class V1(object): def foo(self) pass V1 = V1()
將上面代碼保存在文件test.py,要使用時,直接在其他文件中導(dǎo)入此文件中的對象,這個對象既是單例模式的對象
如:from a import V1
2:使用裝飾器
def Singleton(cls): _instance = {} def _singleton(*args, **kargs): if cls not in _instance: _instance[cls] = cls(*args, **kargs) return _instance[cls] return _singleton @Singleton class A(object): a = 1 def __init__(self, x=0): self.x = x a1 = A(2) a2 = A(3)
3:使用類
4:基于__new__方法實(shí)現(xiàn)
當(dāng)我們實(shí)例化一個對象時,是先執(zhí)行了類的__new__方法
當(dāng):(我們沒寫時,默認(rèn)調(diào)用object.__new__),實(shí)例化對象;然后再執(zhí)行類的__init__方法,對這個對象進(jìn)行初始化,所有我們可以基于這個,實(shí)現(xiàn)單例模式
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 詳解Django之a(chǎn)dmin組件的使用和源碼剖析
- django admin管理工具自定義時間區(qū)間篩選器DateRangeFilter介紹
- Django admin管理工具TabularInline類用法詳解
- Django Xadmin多對多字段過濾實(shí)例
- 解決Django部署設(shè)置Debug=False時xadmin后臺管理系統(tǒng)樣式丟失
- Django Admin后臺添加數(shù)據(jù)庫視圖過程解析
- Django Admin設(shè)置應(yīng)用程序及模型順序方法詳解
- 解決django xadmin主題不顯示和只顯示bootstrap2的問題
- django xadmin中form_layout添加字段顯示方式
- Django admin組件的使用
相關(guān)文章
pytorch fine-tune 預(yù)訓(xùn)練的模型操作
這篇文章主要介紹了pytorch fine-tune 預(yù)訓(xùn)練的模型操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-06-06python client使用http post 到server端的代碼
python client使用 http post 到server端的代碼,供大家學(xué)習(xí)參考2013-02-02Python私有屬性私有方法應(yīng)用實(shí)例解析
這篇文章主要介紹了Python私有屬性私有方法應(yīng)用場景解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-09-09