Django----Admin流程
Admin执行步骤
启动文件: 1:创建app-----stark 2:在每个app中创建stark 3:django----admin---- 4:在stark中写入:----------------------------------去以注册的所有的app中,找到stark.py文件并加载 from django.apps import AppConfig class StarkConfing(AppConfig): name = 'stark' def ready(self): from django.utils.module_loading import autodiscover_modules autodiscover_modules('stark') 5:在settings中注册app: 路由系统: 一:运行程序,找到每个app下的admin.py执行并加载 1:--app01.admin.py 2:-创建admin.site中的对象---------------site下的----site = AdminSite()-----本质实例化一个对象 3:-执行对象的register方法---------------目的将注册类添加到_register中 4:--app02.admin.py 5:-用app01.admin.py创建的admin.site对象----site下的----site = AdminSite()----单例----以后不管谁来调用都使用这个对象。 admin.site是一个对象(单例模式创建),其中封装了_register 二:执行urls.py 1:--url(r'^admin/',admin.site.urls)----再次调用admin.site的urls属性 --admin.site.urls-----admin.site调用urls方法----(没加括号:在上面加@property,不加括号也能执行) 2:返回了一个元组,元组有三个元素------self.get_urls()----'admin'-----self.name --@property def urls(self): return self.get_urls(), 'admin', self.name --第一个是一个函数------self.get_urls() --第一个函数返回的是一个列表-------列表中是url-------从某个地方读出来,放在列表中。 urlpatterns = [ url(r'^$', wrap(self.index), name='index'), url(r'^login/$', self.login, name='login'), url(r'^logout/$', wrap(self.logout), name='logout'), url(r'^password_change/$', wrap(self.password_change, cacheable=True), name='password_change'), url(r'^password_change/done/$', wrap(self.password_change_done, cacheable=True), name='password_change_done'), url(r'^jsi18n/$', wrap(self.i18n_javascript, cacheable=True), name='jsi18n'), url(r'^r/(?P<content_type_id>\d+)/(?P<object_id>.+)/$', wrap(contenttype_views.shortcut), name='view_on_site'), ] ----([],None,None) 3:去admin.site中读出类,生成url,放在列表中。 --循环admin.site中的_register--------(里面放的注册类) for k,v in admin.site._register.items():------k是类名--------v---model_admin的对象 --找到类的名称,将k命名为model_class---(model中的类) for model_class,v in admin.site._register.items(): 类名clas_list = model_class._meta.model_name--------------获取当前类名 --找到app名称 app名称app_name = model_class._meta.app_lable-------------获取当前类所在的app名称 --生成url ual = url(r''{0}/{1}.format(app_name,clas_list),函数名,name='函数名')---------/.头../app名称.../类名称..../ --添加到列表 url_list = [] url.append(ual) --每个类的增,删,改,查,分别对应一个函数。 ---admin.site.urls---返回一个元组(self.get_urls,None,None)----get_urls返回一个列表[uels] 路由include:---------通过反射找到模块-----------找到parent-------url 1:定义一个函数-----定义一个列表-----生成四个url(增删查改)-----返回 def get_urls() temp= [ url(r'^$'.format(app_name,cls_name),chagelest_view), url(r'^add/$'.format(app_name,cls_name),add_view), url(r'^(\d+)del/$'.format(app_name,cls_name),del_view), url(r'^(\d+)change/$'.format(app_name,cls_name),change_view), ] return temp --循环admin.site中的_register--------(里面放的注册类) for k,v in admin.site._register.items():------k是类名 --找到类的名称,将k命名为model_class---(model中的类) for model_class,v in admin.site._register.items(): 类名clas_list = model_class._meta.model_name--------------获取当前类名 --找到app名称 app名称app_name = model_class._meta.app_lable-------------获取当前类所在的app名称 --生成url,再添加一个元组----第一个元素是get_urls[],第二和第三个为None. ual = url(r'{0}/{1}/.format(app_name,clas_list)',include(get_urls,None,None))---------/.头../app名称.../类名称..../增删查改/ --添加到列表 url_list = [] url.append(ual)