暇人じゃない

「はじめての Django アプリ作成」チュートリアルをやったメモ その2

はじめての Django アプリ作成、その 2 — Django v1.0 documentation http://djangoproject.jp/doc/ja/1.0/intro/tutorial02.html

前回の続きでチュートリアルを追ってみた個人的メモです。

「はじめての Django アプリ作成」チュートリアルをやったメモ その1 | 暇人じゃない http://chocoby.jp/blog/2010/10/31/first-django-app-tutorial-memo-1/

環境: MacOS X 10.6.4 Python 2.6.5 Django 1.2.3

管理サイトの有効化

settings.py

INSTALLED_APPS に django.contrib.admin を追加 or コメントアウトを解除

INSTALLED_APPS = (
    'django.contrib.admin',
)

管理サイト用のテーブルの作成

python manage.py syncdb

URLconf

追加 or コメントアウトを解除

#urls.py
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    (r'^admin/', include(admin.site.urls)),
)

管理サイトへアクセス

python manage.py runserver でサーバーを起動して http://127.0.0.1:8000/admin にアクセス

チュートリアルその1で、プロジェクトのデータベースを作成する時に作成した管理者ユーザーとパスワードでログインする。

Poll モデルを編集できるようにする

from django.contrib import admin
admin.site.register(Poll)

上のコードを追加してページをリロードすると、Poll モデルが表示される。 色々触ってみる。

管理サイトの表示項目をカスタマイズ

フィールドの表示順番を変更する

Date Published フィールドを Question フィールドの前に表示する。

class PollAdmin(admin.ModelAdmin):
    fields = ['pub_date', 'question']

admin.site.register(Poll, PollAdmin)

Question フィールドと Date Published フィールドを別々のフィールドセットに表示する。

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date']}),
    ]

admin.site.register(Poll, PollAdmin)

fieldsets に ‘classes’: ['collapse’]を指定すると、そのフィールドセットが折りたたまれた状態になる。

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]

admin.site.register(Poll, PollAdmin)

Choice モデルの追加

Choice モデルを admin に登録する。 python admin.site.register(Choice)

Choice と Poll が同時に入力できるフォームが表示される。 ここで Poll に対して Choice を追加したり、Poll を選択したり新たに追加したりできる。

でも Poll の中で Choice を複数追加できたほうがいいよね! じゃあそうしよう。

admin.site.register(Choice) を削除

class ChoiceInline(admin.StackedInline):
    model = Choice
    extra = 3

class PollAdmin(admin.ModelAdmin):
    fieldsets = [
        (None,               {'fields': ['question']}),
        ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
    ]
    inlines = [ChoiceInline]

admin.site.register(Poll, PollAdmin)

http://127.0.0.1:8000/admin/ にアクセスして、Add poll に移動

Poll に対して 3つの Choice が一度追加できるようになった! この数は ChoiceInline の extra で変更できる

もうちょっと表示をコンパクトにしたい

class ChoiceInline(admin.StackedInline):

class ChoiceInline(admin.TabularInline):

編集したい Poll を選択するページをカスタマイズする

表示するカラムを増やす

class PollAdmin(admin.ModelAdmin):
    #
    list_display = ('question', 'pub_date', 'was_published_today')

pubdate と waspublishedtoday が表示されるようになる。 waspublished_today 以外のカラムのヘッダをクリックすれば並び替えできる。 CakePHP でいう paginate みたいなものかな。

カラム名の変更

class Poll(models.Model):
    #
    was_published_today.short_description = 'Published today?'

表示するカラム名を'Published today?'に変更できる

フィルターの追加

class PollAdmin(admin.ModelAdmin):
    #
    list_filter = ['pub_date']

右側に Any date/Today/Past 7 days/This month/This year が出てきた。 Poll が「今日作成した Poll」などといった条件でフィルタリングできるようになった!すごい。

検索ボックス

class PollAdmin(admin.ModelAdmin):
    #
    search_fields = ['question']

question フィールドに対しての検索ボックスが表示される。

階層で絞り込み

class PollAdmin(admin.ModelAdmin):
    #
    date_hierarchy = 'pub_date'

さっきの範囲指定に加えて pub_date 年/月/日と階層で検索できるようになる。

もちろんページング機能もある。 検索機能との連携はバッチリ…!らしい。

管理サイトの見た目をカスタマイズ

テンプレート置き場の作成 mysite 以下に mytemplates ディレクトリを作成

settings.py の TEMPLATE_DIRS にテンプレート置き場を指定する。

TEMPLATE_DIRS = (
    '/Users/chocoby/Development/hoge/mysite/mytemplates'
)

mytemplates ディレクトリ以下に admin ディレクトリを作成、ここに管理サイトのテンプレートを置く。

Django デフォルトの管理サイトのテンプレートをコピーする

$ cp ~/Development/Django-1.2.3/django/contrib/admin/templates/admin/base_site.html mytemplates/admin/

管理サイトのタイトルの変更 mytemplates/admin/base_site.html

{% block title %}{{ title }} | {% trans 'Django site admin' %}{% endblock %}
↓
{% block title %}{{ title }} | {% trans 'Hoge site admin' %}{% endblock %}

見出しのタイトルの変更 mytemplates/admin/base_site.html

<h1 id="site-name">{% trans 'Django administration' %}</h1><h1 id="site-name">{% trans 'Hoge administration' %}</h1>

admin テンプレートは django/contrib/admin/templates 内から mytemplates に階層を守って突っ込めば、オーバーライドすることができる。

管理サイトトップページのカスタマイズ

$ cp ~/Development/Django-1.2.3/django/contrib/admin/templates/admin/index.html mytemplates/admin/

admin/index.html を編集すると、管理サイトのトップページをカスタマイズすることができる。