django-admin sites

在使用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的首頁。

相關文章
相關標籤/搜索