2013年9月5日木曜日

DjangoとSQLiteを使ったサンプルアプリ:管理画面編

前回はUbuntu環境にPython+Django+SQLite3な環境を構築しました。
次はDjangoとSQLite3を使った簡単な「アンケート調査アプリ」を作ってみましょう。
多くのWebアプリがそうであるように、このアプリにも「公開用画面」と「管理画面」がありますが、今回は後者の「管理画面」の作り方から紹介したいと思います。

これから作るプロジェクトの雛形には、前回作った mysite プロジェクトを再利用します。

データベース設定


今回はデータベースを使うので、 settings.py にDB接続情報を設定します。
~/mysite/mysite/settings.py
...
import os

DATABASES = {
  'default': {
    'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
    'NAME': os.path.realpath(os.path.dirname(__file__)) + os.sep + 'db.sqlite3', # Or path to database file if using sqlite3.
    'USER': '', # Not used with sqlite3.
    'PASSWORD': '', # Not used with sqlite3.
    'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
    'PORT': '', # Set to empty string for default. Not used with sqlite3.
  }
}
...
これは ~/mysite/mysite/db.sqlite3 というSQLite3のデータベースファイルを作る設定です。
syncdb を実行することで、実際にデータベースファイルが作成されます。
$ python manage.py syncdb
  Creating tables ...
  Creating table auth_permission
  Creating table auth_group_permissions
  Creating table auth_group
  Creating table auth_user_user_permissions
  Creating table auth_user_groups
  Creating table auth_user
  Creating table django_content_type
  Creating table django_session
  Creating table django_site

  You just installed Django's auth system, which means you don't have any superusers defined.
  Would you like to create one now? (yes/no): yes
  Username (leave blank to use 'hoge'): 
  E-mail address: 
  Error: That e-mail address is invalid.
  E-mail address: hoge@moge.com
  Password: 
  Password (again): 
  Superuser created successfully.
  Installing custom SQL ...
  Installing indexes ...
  Installed 0 object(s) from 0 fixture(s)
途中でUsernameやPasswordなどが聞かれますので適切に入力してください。というのも、ここで作ったUsernameとPasswordが後に管理画面を作った際に使用できるログイン情報となるからです。ただ、なぜEmailが入力必須なのかは不明・・・

アプリの雛形を作成


では、「アンケート調査アプリ」の雛形を作りましょう。今回はチュートリアルに従い、アプリ名を polls としました。
$ cd ~/mysite
$ python manage.py startapp polls
この時点で下記ような階層構造が作られているはずです。(Django1.4の場合)
~/mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    polls/
        __init__.py
        models.py
        tests.py
        views.py

モデルを編集


~/mysite/polls/models.py がモデルを定義するファイルです。これを下記のとおりに編集してみます。
# coding: UTF-8
from django.db import models

#
# アンケート質問モデル
#
class Poll(models.Model):
  question = models.CharField(max_length=200)
  pub_date = models.DateTimeField('date published')
  
  def __unicode__(self):
    return self.question

#
# アンケート選択モデル
#
class Choice(models.Model):
  poll = models.ForeignKey(Poll)
  choice_text = models.CharField(max_length=200)
  votes = models.IntegerField(default=0)
  
  def __unicode__(self):
    return self.choice_text
Poll(質問)とChoice(選択)という2つのモデルが定義されました。
ここで定義したモデルをアクティベートするために再び settings.py を修正します。
...
INSTALLED_APPS = (
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.sites',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  # Uncomment the next line to enable the admin:
  # 'django.contrib.admin',
  # Uncomment the next line to enable admin documentation:
  # 'django.contrib.admindocs',
  'polls'
)
...
これでDjangoが polls というアプリ名を認識できるようになりました。
ここで python manage.py sql polls を実行すれば、作成されたモデルのSQL(CREATE文)を見ることができます。
~/mysite$ python manage.py sql polls
  BEGIN;
  CREATE TABLE "polls_poll" (
      "id" integer NOT NULL PRIMARY KEY,
      "question" varchar(200) NOT NULL,
      "pub_date" datetime NOT NULL
  )
  ;
  CREATE TABLE "polls_choice" (
      "id" integer NOT NULL PRIMARY KEY,
      "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id"),
      "choice_text" varchar(200) NOT NULL,
      "votes" integer NOT NULL
  )
  ;
  COMMIT;
PK(id)やFK(poll_id)が自動的に作られていますね。

ここで再び syncdb することで、データベースのテーブルが再構築されます。

管理画面を作成


Djangoは管理画面を自動生成してくれます。
settings.py を修正して管理画面を有効にしてみましょう。
...
INSTALLED_APPS = (
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.sites',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  # Uncomment the next line to enable the admin:
  'django.contrib.admin',
  # Uncomment the next line to enable admin documentation:
  # 'django.contrib.admindocs',
  'polls'
)
...
上記のように 'django.contrib.admin' のコメントを外し、再び syncdb を実行してデータベースを再構築しましょう。

次に ~/mysite/mysite/urls.py の一部のコメントを外します。ちなみに urls.py はURLスキーマ(URLマッピング)を定義するファイルです。
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'^$', 'mysite.views.home', name='home'),
  # url(r'^mysite/', include('mysite.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)),
)
強調表示されているところがコメントを外した箇所です。

ここで開発サーバを再起動して、管理画面(http://127.0.0.1:8000/admin/)を確認してみましょう。
$ python manage.py runserver 8000
UsernameとPasswordを尋ねられると思いますが、最初に syncdb したときに作成したUsernameとPasswordを入力してログインします。

管理画面にログイン後に気づいたかもしれませんが、この時点では Site administration に Polls アプリケーションが表示されていません。これを有効にするためには下記のファイルを新規作成します。
~/mysite/polls/admin.py
# coding: UTF-8
from django.contrib import admin
from polls.models import Choice, Poll

class ChoiceInline(admin.StackedInline):
  model = Choice
  # Choice入力項目数
  extra = 3

class PollAdmin(admin.ModelAdmin):
  # 表示レイアウト
  fieldsets = [
    (None, { 'fields': ['question'] }),
    ('Date information', { 'fields': ['pub_date'], 'classes': ['collapse'] }),
  ]
  inlines = [ChoiceInline]
  # 表示項目
  list_display = ('question', 'pub_date')
  # フィルタ項目
  list_filter = ['pub_date']
  # 検索項目
  search_fields = ['question']
  # 日付でフィルタリング
  date_hierarchy = 'pub_date'

admin.site.register(Poll, PollAdmin)

開発サーバを再起動して、再度管理画面(http://127.0.0.1:8000/admin/)にログインしてみてください。PollモデルやChoiceモデルのCRUD画面が自動的に生成されているはずです。




サラッと説明しましたが、管理画面の作成は以上となります。
次回はDjangoアプリの公開用画面の作り方をご紹介します。

0 件のコメント:

コメントを投稿