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/です!