気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM等について、学んだことや備忘録をアウトプットとして残し、情報を必要としている誰かにとって「かゆいところに手が届く」ブログとなることを願いながら記事を書いています。

【Django】adminサイトのコードを読む

スポンサーリンク

目的

  • adminサイトから部品化の方法を学ぶ

index
1. app.urls.py
2. django.contrib.admin.site.py
3. urlsプロパティ

app.urls.py

url(r'^admin/', include(admin.site.urls)),
  • アプリケーションのurlに記載するadminサイトのurlパターン
  • django.contrib.adminをインポート

django.contrib.admin.sites.py

452行目

# This global object represents the default admin site, for the common case.
# You can instantiate AdminSite in your own code to create a custom admin site.
# このグローバルオブジェクトは、一般的な場合のデフォルトのadminサイトを表します。
# カスタム管理サイトを作成するために、独自のコードでAdminSiteをインスタンス化することができます。
site = AdminSite()
  • siteはAdminSiteクラスのインスタンス
  • AdminSiteクラス定義は、29~448行目

urlsプロパティ

252行目

@property
def urls(self):
    return self.get_urls(), self.app_name, self.name
  • get_urls()とapp_Name, nameの組(タプル)を返却
  • urlの基本は、patternsのタプル - patterns('', url(), url())

207行目

def get_urls(self):
    from django.conf.urls import patterns, url, include

    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 = patterns('',
        url(r'^$',
            wrap(self.index),
            name='index'),
        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'),
        url(r'^(?P<app_label>\w+)/$',
            wrap(self.app_index),
            name='app_list')
    )

    # Add in each model's views.
    for model, model_admin in six.iteritems(self._registry):
        urlpatterns += patterns('',
            url(r'^%s/%s/' % (model._meta.app_label, model._meta.model_name),
                include(model_admin.urls))
        )
    return urlpatterns
  • wrapで処理した認証系ビューをパターンに登録
  • six.iteritems(self._registry)の個数だけ、ループしてurlpatternに追記する
  • wrapとは何か
    • update_wrapperメソッドを返却するメソッド。