下面,我们只看看主要的步骤:
1.项目启动,遍历settings下面的INSTALLED_APPS,导入默认配置。
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'app01.apps.App01Config', 'app02.apps.App02Config', 'niubin.apps.NiubinConfig', ]
2.接下来执行apps.populate(settings.INSTALLED_APPS)函数,该函数主要完成了以下几个步骤:
step-one:
# 步骤一:初始化app配置并且导入app模块 for entry in installed_apps: if isinstance(entry, AppConfig): app_config = entry else: app_config = AppConfig.create(entry) if app_config.label in self.app_configs: raise ImproperlyConfigured( "Application labels aren't unique, " "duplicates: %s" % app_config.label) self.app_configs[app_config.label] = app_config app_config.apps = self
step-two:
# 步骤二:导入model模块 for app_config in self.app_configs.values(): app_config.import_models()
step-three:
# 步骤三:执行每个app模块中的ready()方法 for app_config in self.get_app_configs(): #app_config:<AuthConfig: auth> #app_config:<SessionsConfig: sessions> app_config.ready()# 这里要注意,如何apps中没有定义ready()方法,就会执行AppConfig类中的默认ready()方法
3.如果上述过程中的ready()函数执行了autodiscover()函数,如:autodiscover('nb'),就会完成以下操作:
def autodiscover_modules(*args, **kwargs): '''搜索每个app下面的'admin''' # args:'amdmin' from django.apps import apps register_to = kwargs.get('register_to') for app_config in apps.get_app_configs(): # app_config:<AuthConfig: auth>.... for module_to_search in args: # module_to_search:'admin' # module_to_search:'niubi' 搜索每个app下的nb模块 pass
這个函数完成的主要功能就是,搜索每个app下面的nb模块。也就是说,如果autodiscover('admin'),就会寻找每个app下面的admin模块,我们都知道,admin模块主要完成model的注册功能,那么只要调用了自动发现函数,那么函数的注册功能就在这一步完成的!
4.我们顺着admin.site.register()函数继续往下分析,这步操作完成了以下操作:
site = AdminSite() # 生成了一个全局的site实例
接着,该实例调用了register函数,我们跟进去看看,這个函数做了什么操作:
def register(self, model_or_iterable, admin_class=None, **options): if not admin_class: admin_class = ModelAdmin if isinstance(model_or_iterable, ModelBase): model_or_iterable = [model_or_iterable] for model in model_or_iterable: if model._meta.abstract: raise ImproperlyConfigured( 'The model %s is abstract, so it cannot be registered with admin.' % model.__name__) if model in self._registry: raise AlreadyRegistered('The model %s is already registered' % model.__name__) if not model._meta.swapped: if options: options['__module__'] = __name__ admin_class = type("%sAdmin" % model.__name__, (admin_class,), options) self._registry[model] = admin_class(model, self)
admin.site.register(models.UserGroup,admin.ModelAdmin)
register操作完成以后,生成了一个这样的字典:
{
models.UserInfo: UserInfoAdmin(models.UserInfo,site对象)[add,change..],
models.UserGroup: ModelAdmin(models.UserGroup,site对象),}
然后回到urls.py文件中,生成对应的路由映射关系:
urlpatterns = [ url(r'^nb/', v1.site.urls), ]