.. _intro-tutorial02: ===================================== はじめての Django アプリ作成、その 2 ===================================== :revision-up-to: 8961 (1.0) このチュートリアルは :ref:`チュートリアルその 1 ` の続き です。ここでは、引続き Web 投票アプリケーションの開発を例にして、Django が 自動生成する管理サイト (admin) を中心に解説します。 .. admonition:: 設計哲学 :class: admonition-philosophy コンテンツの追加や変更、削除を行うためのスタッフや顧客向けの管理サイト 構築は、創造性の欠けた退屈なものです。そこで、 Django ではモデルを管 理するための admin インタフェースを完全に自動化しています。 Django はニュースルーム環境で開発されました。ニュースルーム環境では、 「コンテンツの作成者 (content publisher)用」と「公開用 (public) 」サイ トをきわめて明確に区別しています。サイト管理者は新たな話題やイベント、 スポーツのスコアなどの入力に使い、コンテンツは公開用サイト上で表示され ます。 Django は、サイト管理者向けの一元化されたコンテンツ編集インタフェー スの提供という問題を解決しているのです。 admin は一般のサイトを訪問者に使ってもらうためのものではなく、サイト管 理者のためのものなのです。 .. _Activate the admin site: admin サイトの有効化 ==================== デフォルトでは、 Django の管理サイトは無効化されていて、自分で選択して有効 にせねばなりません。 admin を有効にするには、以下の 3 つの作業が必要です: * :setting:`INSTALLED_APPS` 設定に ``"django.contrib.admin"`` を追加し ます。 * ``python manage.py syncdb`` を実行します。新たなアプリケーションを :setting:`INSTALLED_APPS` に追加したので、データベースを更新せねばな りません。 * ``mysite/urls.py`` ファイルを編集し、 "Uncomment this for admin:" と 書かれた行の次の行のコメントアウトを解除します。このファイルは URLconf といいます。 URLconf についてはチュートリアルの次の部で解説し ます。今はただ、この設定が URL をアプリケーションに対応づけていること だけを覚えておきましょう。最終的に、 ``urls.py`` は以下のようになるは ずです: .. parsed-literal:: from django.conf.urls.defaults import * # Uncomment the next two lines to enable the admin: **from django.contrib import admin** **admin.autodiscover()** urlpatterns = patterns('', # Example: # (r'^mysite/', include('mysite.foo.urls')), # Uncomment the admin/doc line below and add 'django.contrib.admindocs' # to INSTALLED_APPS to enable admin documentation: # (r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: **(r'^admin/(.*)', admin.site.root),** ) (太字の行はコメントを外した部分です) 開発サーバの起動 ================ 開発用サーバを起動して、管理サイトを探検してみましょう。 チュートリアルその 1 で、開発サーバを以下のように起動したのを思い出してくだ さい: .. code-block:: bash python manage.py runserver 次はブラウザを起動して、ローカルドメインの "/admin/" 、つまり http://127.0.0.1:8000/admin/ にアクセスします。以下のような admin のログイ ン画面が表示されるはずです: .. image:: _images/admin01.png :alt: Django admin login screen .. _Enter the admin site: 管理サイトに入る ================== さあログインしてみましょう。(チュートリアルその 1 で、スーパユーザのアカウ ントを作成したはずです。覚えていますか?) ログインしたら、管理サイトのインデ クスページが表示されるはずです: .. image:: _images/admin02t.png :alt: Django admin index page 他にも、「グループ (Groups)」や「ユーザ (Users)」、「サイト (Sites)」といっ た編集可能なコンテンツが表示されるはずです。これらはデフォルトで Django に付属しているコアの機能です。 .. _Make the poll app modifiable in the admin: Poll モデルを admin 上で編集できるようにする ============================================== ところで、 polls アプリケーションはどこにあるんでしょう? admin のインデ クスページを見ても表示されていませんね。 実は、まだ一つやるべきことが残っていました。 admin に ``Poll`` モデルがイ ンタフェースを持つことを教える必要があるのです。 ``mysite/polls/models.py`` ファイルを編集して、末尾に以下のような一文を加えてください:: from django.contrib import admin admin.site.register(Poll) admin のページをリロードして、どんな変化が起きたか見てみましょう。 開発サーバはプロジェクトを自動的にリロードしてくれるので、コードに加えた変 更はただちにブラウザで確認できます。 .. _Explore the free admin functionality: admin の機能を探究してみる ================================ ``Poll`` モデルを登録したので、 Django は ``Poll`` を管理サイトに表示するよ うになりました: .. image:: _images/admin03t.png :alt: Django admin index page, now with polls displayed 「Polls」 をクリックしてみてください。 変更リスト (change list) のページ に入ります。このページはデータベース上の全ての ``Poll`` オブジェクトを表示 し、オブジェクトを選択して変更できるようになっています。前のチュートリアル で作成した 「What's up」という ``Poll`` オブジェクトがありますね。 .. image:: _images/admin04t.png :alt: Polls change list page 「What's up?」をクリックして編集してみましょう: .. image:: _images/admin05t.png :alt: Editing form for poll object 以下の点に注意してください: * フォームは 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」を変更し てみましょう。変更したら、「保存して編集を続ける」を押します。次に、右上に ある「履歴 (History)」をクリックしてみましょう。ユーザが admin 上でこのオブ ジェクトに対して行った全ての変更履歴を、変更時刻と変更を行ったユーザの名前 つきでリストにしたページを表示します: .. image:: _images/admin06t.png :alt: History page for poll object .. _Customize the admin form: 管理サイトフォームのカスタマイズ =================================== しばらく操作してみましょう。これだけの機能をコードを書かずに実現したこ とに驚くはずです。 ``admin.site.register(Poll)`` の呼び出しによって、 Django はオブジェクトの表示方法を「推測」し、 admin でモデルの編集を行え るようにします。 admin の表示や挙動を少し変えたい場合には、モデルを登録 するときにオプションを指定します。 試しに、編集フォームでのフィールドの並び順を並べ替えてみましょう。 ``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: Fields have been reordered 二つしかフィールドがないので、あまりぱっとした変化ではありませんね。しかし 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: Form has fieldsets now 各フィールドセットには任意の HTML クラスを指定できます。 Django では ``"collapse"`` というクラスを提供していますが、このクラスを指定すると、フィー ルドセットは最初折り畳まれた状態で表示されます。これは普段は使わないフィー ルドがたくさんあるようなフォームを使っている場合に便利です:: class PollAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ] .. image:: _images/admin09.png :alt: Fieldset is initially collapsed .. _Adding related objects: リレーションを張ったオブジェクトの追加 ====================================== OK、 Poll の admin ページはできました。しかし ``Poll`` は複数の ``Choice`` を持つのに、 admin ページには表示されていませんね。 今のところは。 この問題の解決法は二つあります。一つ目は、 ``Poll`` と同様、以下のようにし て ``Choice`` モデルを admin に登録するというものです:: from mysite.polls.models import Choice admin.site.register(Choice) これで、 Django admin 上で「Choice」 を選べます。「Choice の追加」フォーム は以下のようになります: .. image:: _images/admin10.png :alt: Choice admin page このフォームでは「Poll」フィールドは選択ボックスで、データベース上の全ての Poll オブジェクトを選ます。 Django は :class:`~django.db.models.ForeignKey` を表示する時には ``