===================================== はじめての Django アプリ作成、その 2 ===================================== :revision-up-to: 17812 (1.4) このチュートリアルは :doc:`チュートリアルその 1 ` の続き です。ここでは、引続き Web 投票アプリケーションの開発を例にして、Django が 自動生成する管理サイト (admin) を中心に解説します。 .. admonition:: 設計哲学 :class: admonition-philosophy コンテンツの追加や変更、削除を行うためのスタッフや顧客向けの管理サイト 構築は、創造性の欠けた退屈なものです。そこで、 Django ではモデルを管 理するためのインタフェース生成を完全に自動化しています。 Django はニュースルーム環境で開発されました。ニュースルーム環境では、 「コンテンツの作成者 (content publisher) 用」と「公開用 (public) 」サイ トをきわめて明確に区別しています。サイト管理者は新たな話題やイベント、 スポーツのスコアなどの入力に使い、コンテンツは公開用サイト上で表示され ます。 Django は、サイト管理者向けの一元化されたコンテンツ編集インタフェー スの提供という問題を解決しているのです。 admin は一般のサイト訪問者に使ってもらうためのものではなく、サイト管理 者のためのものです。 管理サイトの有効化 ==================== デフォルトでは、 Django の管理サイトは無効化されていて、自分で選択して有効 にせねばなりません。 admin を有効にするには、以下の 3 つの作業が必要です: * :setting:`INSTALLED_APPS` 設定の ``"django.contrib.admin"`` をコメント アウトを解除します。 * ``python manage.py syncdb`` を実行します。新たなアプリケーションを :setting:`INSTALLED_APPS` に追加したので、データベースを更新せねばな りません。 * ``mysite/urls.py`` ファイルを編集し、 admin に関連する3行のコメントアウト を解除します。このファイルは URLconf といいます。 URLconf についてはチュー トリアルの次の部で解説します。今はただ、この設定が URL をアプリケーション に対応づけていることだけを覚えておきましょう。最終的に、 ``urls.py`` は 以下のようになるはずです: .. parsed-literal:: from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: **from django.contrib import admin** **admin.autodiscover()** urlpatterns = patterns('', # Examples: # url(r'^$', '{{ project_name }}.views.home', name='home'), # url(r'^{{ project_name }}/', include('{{ project_name }}.foo.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: **url(r'^admin/', include(admin.site.urls)),** ) (太字の行はコメントを外した部分です) 開発サーバの起動 ================ 開発用サーバを起動して、管理サイトを探検してみましょう。 チュートリアルその 1 で、開発サーバを以下のように起動したのを思い出してくだ さい: .. code-block:: bash python manage.py runserver 次はブラウザを起動して、ローカルドメインの "/admin/" 、つまり http://127.0.0.1:8000/admin/ にアクセスします。以下のような admin のログイ ン画面が表示されるはずです: .. image:: _images/admin01.png :alt: Django 管理サイトのログイン画面 .. admonition:: 自分の画面と違う場合 もしこの時点で、上のログイン画面の代わりに以下のようなエラーの画面が 表示された場合は:: ImportError at /admin/ cannot import name patterns ... おそらくこのチュートリアルのバージョンとは違う Django のバージョンを 使用していることでしょう。古いチュートリアルを参照するか、新しいバー ジョンの Django を入手してください。 管理サイトに入る ================== さあログインしてみましょう。(チュートリアルその 1 で、スーパユーザのアカウ ントを作成したはずです。覚えていますか?) ログインしたら、管理サイトのインデ クスページが表示されるはずです: .. image:: _images/admin02t.png :alt: Django 管理サイトのインデクスページ 「グループ (Groups)」や「ユーザ (Users)」、「サイト (Sites)」といった編集 可能なコンテンツが表示されるはずです。これらはデフォルトで Django に付属し ているコアの機能です。 Poll モデルを admin 上で編集できるようにする ============================================== ところで、 polls アプリケーションはどこにあるんでしょう? admin のインデ クスページを見ても表示されていませんね。 実は、まだ一つやるべきことが残っていました。 admin に ``Poll`` モデルがイ ンタフェースを持つことを教える必要があるのです。 ``polls`` ディレクトリに ``admin.py`` ファイルを追加して、以下のように編集してください:: from polls.models import Poll from django.contrib import admin admin.site.register(Poll) admin のページをリロードして、どんな変化が起きたか見てみましょう。通常、 開発サーバはプロジェクトを自動的にリロードしてくれるので、コードに加えた変 更はただちにブラウザで確認できます。 admin の機能を探究してみる ================================ ``Poll`` モデルを登録したので、 Django は ``Poll`` を管理サイトに表示するよ うになりました: .. image:: _images/admin03t.png :alt: Django 管理サイトに Poll が表示されるようになった 「Polls」 をクリックしてみてください。 チェンジリスト (change list) のペー ジに入ります。このページはデータベース上の全ての ``Poll`` オブジェクトを表 示していて、変更したいオブジェクトを選択できます。前のチュートリアルで作成 した 「What's up」という ``Poll`` オブジェクトがありますね。 .. image:: _images/admin04t.png :alt: Poll のチェンジリストページ 「What's up?」をクリックして編集してみましょう: .. image:: _images/admin05t.png :alt: Poll オブジェクトの編集 以下の点に注意してください: * フォームは Poll モデルをもとに自動的に生成されています。 * モデルのフィールドの型によって ( :class:`~django.db.models.DateTimeField`, :class:`~django.db.models.CharField` などの) 適切な HTML 入力ウィジェッ トが対応しています。各タイプのフィールドには、 Django 管理サイトでデー タを表示する方法が定義されています。 * :class:`~django.db.models.DateTimeField` には JavaScript のショートカッ トがついています。日付 (Date) のカラムには「今日 (Today)」へのショート カットと、カレンダーのポップアップボタンがあります。時刻 (Time) のカラ ムには「現在 (Now)」へのショートカットと、よく入力される時間のリストを 表示するポップアップボタンがあります。 ページの末尾の部分には操作ボタンがいくつか表示されています: * 保存 (Save) -- 変更を保存して、このモデルの変更リストのページに戻ります。 * 保存して編集を続ける (Save and continue editing) -- 変更を保存して、こ のオブジェクトの編集ページをリロードします。 * 保存してもう一つ追加 (Save and add another) -- 変更を保存して、このモデ ルのオブジェクトを新規追加するための空の編集ページをロードします。 * 削除 (Delete) -- 削除確認ページを表示します。 もし「Date published」の値がチュートリアル 1 で作成した時間と違う場合は、 :setting:`TIME_SONE` に現在のタイムゾーンの設定をし忘れた可能性があります。 変更し、リロードして正しい値が表示されるか確認してください。 「今日」や「現在」ショートカットをクリックして、「Date published」を変更し てみましょう。変更したら、「保存して編集を続ける」を押します。次に、右上に ある「履歴 (History)」をクリックしてみましょう。ユーザが管理サイト上でオブ ジェクトに対して行った全ての変更履歴を、変更時刻と変更を行ったユーザの名前 つきでリストにしたページを表示します: .. image:: _images/admin06t.png :alt: Poll オブジェクトの変更履歴 管理サイトフォームのカスタマイズ =================================== しばらく操作してみましょう。これだけの機能をコードを書かずに実現したこ とに驚くはずです。 ``admin.site.register(Poll)`` の呼び出しによって、 Django はオブジェクトの表示方法を「推測」し、管理サイトでモデルの編集を行え るようにします。管理サイトの表示や挙動を少し変えたい場合には、モデルを登録 するときにオプションを指定します。 試しに、編集フォームでのフィールドの並び順を並べ替えてみましょう。 ``admin.site.register(Poll)`` の行を以下のように置き換えてみてください:: class PollAdmin(admin.ModelAdmin): fields = ['pub_date', 'question'] admin.site.register(Poll, PollAdmin) このように、 admin のオプションを変更したいときには、モデルごとに admin オブジェクトを生成して、 ``admin.site.register()`` の 2 番目の引数に渡すと いうパターンを使ってください。 上の例では、「Publication date」フィールドの表示位置を「Question」フィール ドよりも前に変更しています。 .. image:: _images/admin07.png :alt: フィールドの並び順を変えた場合 二つしかフィールドがないので、あまりぱっとした変化ではありませんね。しかし admin フォームで何ダースものフィールドを操作するような場合には、直感的なフィー ルドの並び順というものはユーザビリティ上重要な要素です。 同じく何ダースもフィールドがある場合、フォームを複数のフィールドセットに分 割したいこともあるでしょう:: class PollAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date']}), ] admin.site.register(Poll, PollAdmin) ``fieldsets`` の各タプルの先頭の要素はフィールドセットのタイトルです。 フォームは以下のように表示されます: .. image:: _images/admin08t.png :alt: フィールドセットでフォームを表示 各フィールドセットには任意の HTML クラスを指定できます。 Django では ``"collapse"`` というクラスを提供していますが、このクラスを指定すると、フィー ルドセットは最初折り畳まれた状態で表示されます。これは普段は使わないフィー ルドがたくさんあるようなフォームを使っている場合に便利です:: class PollAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ] .. image:: _images/admin09.png :alt: フィールドセットが最初は折畳みで表示されている リレーションを張ったオブジェクトの追加 ====================================== OK、 Poll の管理サイトページはできました。しかし ``Poll`` は複数の ``Choice`` を持つのに、管理サイトページには表示されていませんね。 今のところは。 この問題の解決法は二つあります。一つ目は、 ``Poll`` と同様、以下のようにし て ``Choice`` モデルを管理サイトに登録するというものです:: from polls.models import Choice admin.site.register(Choice) これで、 Django の管理サイト上で「Choice」 を選べます。「Choice の追加」フォーム は以下のようになります: .. image:: _images/admin10.png :alt: 管理サイトでの Choice の表示 このフォームでは「Poll」フィールドは選択ボックスで、データベース上の全ての Poll オブジェクトを選ます。 Django は :class:`~django.db.models.ForeignKey` を表示する時には ``