PythonのフレームワークDjango1.4のチュートリアル2章をやってみました

前回に引き続き2章をやっていきます。

管理ページを作っていきます

setting.pyを編集します。

INSTALLED_APPS = (

    // snip
    
    # コメントを外します
    'django.contrib.admin',
)

管理者用テーブルを生成します。

$ python manage.py syncdb

urls.pyを編集します。

// snip
# コメントを外します
from django.contrib import admin
admin.autodiscover()

// snip
# コメントを外します
url(r'^admin/', include(admin.site.urls)),

開発用サーバを起動します。

$ python manage.py runserver

http://localhost:8000/admin にアクセスすると、

のような画面が表示されればOKです。

ここで入力するユーザー名とパスワードは、tutorial1で

$ python manage.py syncdb

したときに聞かれたユーザー名とパスワードです。

ログインしてみる

のような画面が表示され、デフォルトではグループ、ユーザー、サイトの管理ができるようです。

管理ツールでpollアプリの変更をしてみる

pollsディレクトリにadmin.pyというファイルを作り、

from polls.models import Poll
from django.contrib import admin

admin.site.register(Poll)

のようなコードを書きます。

このあと、開発用サーバを再起動すると、

のようにpollsアプリの管理ができるようになります。

管理ツールの機能

管理ツールを見てみると、

のように、viewを書いていないのに、polls_pollテーブルの編集ができる画面ができています!
これはモデルに設定したフィールドの型から、フォームを自動生成している為です。
※ DateTimeFieldにしたカラムは、JavaScriptによる今日を取得する機能、カレンダーから日付を選ぶ機能が使えるようになります。

また、

  • Save(フォームの入力内容を保存)
  • Save and add another(フォームの入力内容を保存しつつ新しいレコード追加用のフォーム画面が表示されます)
  • Save and continue editing(フォームの入力内容を保存しつつ、更に編集を続けることができる)
  • Delete(削除用確認画面を表示)

の機能が用意されています。

フォームをカスタマイズする

例えばカラムの順番を変更するには、admin.site.registerの行を以下のように変更します。

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

    admin.site.register(Poll, PollAdmin)

すると、日付と質問欄の並び順が逆になります。

また、項目ごとにグループ分けをしたい場合は、

        fields = ['pub_date', 'question']

の行を、

    fieldsets = [
        (None, {'fields':['question']}),
        ('Date infomation', {'fields':['pub_date']}),
    ]

のように変更すると、fieldsetタグが自動的にpub_dateカラムのまわりに付くようになります。

また、fieldset中にクラスを入れ込んでいくこともできて、

    fieldsets = [
        (None, {'fields':['question']}),
        ('Date infomation', {'fields':['pub_date'],'classes':['collapse']}),
    ]

のように、dictionaryの中に追加したいclass(ここではcollapseクラス)を追加することで、日付欄が折りたためるようになります。

関連するオブジェクトの追加

admin.pyに、

    from polls.models import Choice
    // snip
    admin.site.register(Choice)

の2行を加えると、「Choices」の管理ができるようになります。 このフォームでは、Pollフィールドは、外部キー制約を読み取って、セレクトボックスを自動的に作ってくれます。 また、Pollフィールドの「+」ボタンを押して新しくpollテーブルへレコードを追加することもできます。 Saveした時には、関連したテーブルへの追加も自動的に行なってくれます。

さらに、pollテーブルを追加・更新、削除しようとしたときに関連するchoiceテーブルも変更できるようにするには、

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

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

のようにします。 関連するテーブルのレコード表示件数を多くしたい、でも表示領域は節約したい時は、

    class ChoiceInline(admin.StackedInline)

を、

    class ChoiceInline(admin.TabularInline)

のように変更することで、

のような表示に切り替えることができます。

リストのカスタマイズ

pollテーブル管理の一覧ページにpollテーブルの他のカラム内容を表示したい場合があります。 Djangoは、list_displayという名前のタプルの中に指定したフィールドを表示してくれます。 admin.pyに、

    list_display = ('question', 'pub_date')

を追加すると、question, pub_dateカラムの内容が一覧ページに表示されます。 modelの中のメソッドもカラムとして表示することができ、

    list_display = ('question', 'pub_date', 'was_published_recently')

のように1章でPollモデルに追加したメソッドを指定すると、

のように一覧ページに表示することができます。 カラム名をクリックすると、カラム値でソートできるのは便利です! ただし、後から追加したメソッド(この場合はwas_published_recentlyメソッド)の場合はソートできません。 was_published_recentlyカラムの名前を変えたり、ソートできるようにするには、was_published_recentlyメソッドのプロパティに

    was_published_recently.admin_order_field = 'pub_date'¬
    was_published_recently.boolean = True¬
    was_published_recently.short_description = 'Published recentry?'

のように設定しておきます。

また、

    list_filter = ['pub_date']

のように書くと、「Filter」サイドバーが表示され、pub_dateフィールドで絞込み検索ができるようになります。
※ pub_dateフィールドはDateTimeFieldである必要ありです。

questionフィールドの値を元に、検索したい場合

    search_fields = ['question']

をPollAdminクラスに追加すると

検索窓が付きます。

date_hierarchy = 'pub_date'

としておくと、 年 -> 年・月 -> 日のように階層的に絞込みができるようになります。

管理ツールの見た目をカスタマイズする

管理ツールの見た目を変える場合は、

    PROJECT_DIR / settings.py

の中にあるTEMPLATE_DIRSタプルの中に使いたいテンプレートを指定します。 例として、Djangoのデフォルトテンプレートをコピーしてきて、設置してみます。 Djangoのデフォルトテンプレートは、

    {PYTHON_INSTALL_DIR}/site-packages/django/contrib/admin/templates

に置いてあるので、

    {APP_PATH}/templates

へコピーします。

TEMPLATE_DIRSを、

    TEMPLATE_DIRS = (
        'APP_PATH/templates'
    )

のように変更すると、コピーしたテンプレートの方が使われるようになります。 テンプレートの中をみると、

    {% block branding %}

とか、

    {{ title }}

とか出てきますが、これはDjangoのテンプレートの記法です。3章で説明が出てくるみたいです。
2章は主に管理ツールの機能についてでした。
ほとんどコードを書かなくても、良くある検索やら絞り込みやらできてしまうのはすごいです。
次は 3章https://docs.djangoproject.com/en/dev/intro/tutorial03/です!