django admin组件使用方法详解
关于admin:
(1)admin的概述:
admin是一个django子代的组件,当创建一个项目会后,就会在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的执行流程
当django程序加载的时候,自动循环加载已经注册的APP中的admin.py文件然后执行
#在admin.py文件中有一个__init__文件,其中有代码如下 #意思是:程序的启动自动寻找名为admin的py文件,然后执行 defautodiscover(): autodiscover_modules('admin',register_to=site)
#具体的方法如下: defautodiscover_modules(*args,**kwargs): """ Auto-discoverINSTALLED_APPSmodulesandfailsilentlywhen notpresent.Thisforcesanimportonthemtoregisteranyadminbitsthey maywant. Youmayprovidearegister_tokeywordparameterasawaytoaccessa registry.Thisregister_toobjectmusthavea_registryinstancevariable toaccessit. """
执行admin.py文件中的内容
#在django启动时候,系统自动加载 fromdjango.contribimportadmin #导入该APP下的models fromDRFimportmodels #此处是一个单例模式admion.site admin.site.register(models.Publisher)
单例模式site这里应用的是一个单例模式,对于AdminSite类的一个单例模式,执行的每一个App中的每一个admin.site都是一个对象
#AdminSite类 classAdminSite(object): ... def__init__(self,name='admin'): self._registry={}#model_classclass->admin_classinstance self.name=name self._actions={'delete_selected':actions.delete_selected} self._global_actions=self._actions.copy() all_sites.add(self) .... site=AdminSite()
执行register方法
#AdminSite中的register方法 defregister(self,model_or_iterable,admin_class=None,**options): """ Registersthegivenmodel(s)withthegivenadminclass. Themodel(s)shouldbeModelclasses,notinstances. Ifanadminclassisn'tgiven,itwilluseModelAdmin(thedefault adminoptions).Ifkeywordargumentsaregiven--e.g.,list_display-- they'llbeappliedasoptionstotheadminclass. Ifamodelisalreadyregistered,thiswillraiseAlreadyRegistered. Ifamodelisabstract,thiswillraiseImproperlyConfigured. """
知识补充:单例模式
a.py
classAdminSite(object): def__init__(self): self._registry={} obj1=AdminSite()
b.py
importa a.obj1._registry['k2']=666
c.py
importa a.obj1._registry['k1']=123 print(a.obj1._registry)
单例模式的实现方法
1:使用模块
Python的模块就是天然的单例模式。
因为模块在第一次导入时,会生成.pyc文件,当第二次导入时,就会直接加载.pyc文件,而不会再次执行模块代码。
因此,我们只需把相关的函数和数据定义在一个模块中,就可以获得一个单例对象了。
例如:
classV1(object): deffoo(self) pass V1=V1()
将上面代码保存在文件test.py,要使用时,直接在其他文件中导入此文件中的对象,这个对象既是单例模式的对象
如:fromaimportV1
2:使用装饰器
defSingleton(cls): _instance={} def_singleton(*args,**kargs): ifclsnotin_instance: _instance[cls]=cls(*args,**kargs) return_instance[cls] return_singleton @Singleton classA(object): a=1 def__init__(self,x=0): self.x=x a1=A(2) a2=A(3)
3:使用类
4:基于__new__方法实现
当我们实例化一个对象时,是先执行了类的__new__方法
当:(我们没写时,默认调用object.__new__),实例化对象;然后再执行类的__init__方法,对这个对象进行初始化,所有我们可以基于这个,实现单例模式
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。