在使用django-admin的时候,javascript
首先在INSTALLED_APPS里面添加'django.contrib.admin',而且还有admin所需的另外app。
java
其次配置admin的urls,在urls模块中patterns变量里添加 url(r'^admin/', include(admin.site.urls))。python
在django.contrib.admin.sites模块里,能够看到site只是AdminSite类的实例。django
接下来看看urls的方法定义:app
@property def urls(self): return self.get_urls(), 'admin', self.name
能够看到urls使用了property装饰器,调用self.get_urls( )方法返回结果。ide
def get_urls(self): from django.conf.urls import url, include # Since this module gets imported in the application's root package, # it cannot import models from other applications at the module level, # and django.contrib.contenttypes.views imports ContentType. from django.contrib.contenttypes import views as contenttype_views if settings.DEBUG: self.check_dependencies() def wrap(view, cacheable=False): def wrapper(*args, **kwargs): return self.admin_view(view, cacheable)(*args, **kwargs) return update_wrapper(wrapper, view) # Admin-site-wide views. 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'), ] # Add in each model's views, and create a list of valid URLS for the # app_index valid_app_labels = [] for model, model_admin in six.iteritems(self._registry): urlpatterns += [ url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name), include(model_admin.urls)), ] if model._meta.app_label not in valid_app_labels: valid_app_labels.append(model._meta.app_label) # If there were ModelAdmins registered, we should have a list of app # labels for which we need to allow access to the app_index view, if valid_app_labels: regex = r'^(?P<app_label>' + '|'.join(valid_app_labels) + ')/$' urlpatterns += [ url(regex, wrap(self.app_index), name='app_list'), ] return urlpatterns
首先定义了wrap函数,其实质是装饰器。调用admin_view方法返回可执行对象,而后运行。admin_view方法增长了检测权限的逻辑。函数
update_wrapper函数是functools一个经常使用的函数,更新装饰后的函数的__name__和__doc__属性,方便调试。this
而后能够看到urlpattern的定义。url
接着会为每个注册的Model增长相应的urls,经过调用ModelAdmin的get_urls( )方法。spa
self._registry为字典,格式为 { model_class class : admin_class instance }
six.iteritems只是调用了dict.iteritems。区别是能够添加额外的item,能够用来字典之间的迭代。
def iteritems(d, **kw): return iter(d.iteritems(**kw))
最后增长每一个app的首页。