djangoのチュートリアルをさくっとやってみた(管理サイト構築)

お仕事の事情でpythonエンジニアにスキルチェンジが求められたので
awsにさくっとdjango環境を構築してチュートリアルを行いました。
djangoのチュートリアル

1. サーバ環境準備
awsにマイクロインスタンスでAmazon Linuxを立てました。
対象サーバにログインしてから必要モジュールをインストールします。

// mysql,python2.7 gccをインストール
$ sudo yum install mysql-server mysql-devel gcc
$ sudo yum install python27 python27-devel python-setuptools
$ sudo easy_install pip
// mysql起動
$ sudo service mysqld start
// virtualenvでテスト環境に必要モジュールをインストール
$ sudo pip install virtualenv
$ virtualenv -p /usr/bin/python27 --no-site-packages ~/.django13
$ source ~/.django13/bin/activate
$ pip install django==1.3.7 flup mysql-python

2. チュートリアル用プロジェクトの準備
mysqlにdjango用ユーザを追加

$ mysql -u root
mysql> CREATE DATABASE django;
mysql> GRANT ALL PRIVILEGES ON django.* TO django@localhost IDENTIFIED BY 'django';
mysql> FLUSH PRIVILEGES;

プロジェクト用のディレクトリ(/home/django13/taka512)を作成し、mysqlへの接続設定を追加

$ sudo mkdir /home/django13
$ sudo chmod 777 /home/django13
$ cd /home/django13
$ django-admin.py startproject taka512
$ cd /home/django13/taka512
// mysqlへの接続設定を追加
$ vi settings.py
 12 DATABASES = {
 13     'default': {  
 14         'ENGINE': 'django.db.backends.mysql',
 15         'NAME': 'django',
 16         'USER': 'django',
 17         'PASSWORD': 'django',
 18         'HOST': 'localhost',
 19         'PORT': '3306',
 20     }
 21 }

これで準備は完了です。

3. チュートリアル用アプリの作成
djangoのチュートリアルでは下記機能を備えたウェブアプリを作成します。
(1)投票項目(polls)を追加、変更削除可能な管理(admin)サイト。
(2)人々が投票項目(polls)の参照と投票(vote)が可能な公開サイト

3.1 管理サイトの作成
管理サイトのテーブルとアプリの雛形を作成

// 管理画面用のスキーマをデータベースに作成
// 途中で管理ユーザの作成を聞かれるのでadmin/adminで作成
$ python manage.py syncdb
// アプリケーションの雛形を作成
// (pollsディレクトリに雛形が作成されます)
$ python manage.py startapp polls

3.1.1 modelの作成
下記2つのmodelを作成します。
・投票項目(Poll):質問と発行日を保持
・投票選択肢(Choice):投票の選択肢と集計を保持、各選択肢は投票項目に関連付

$ vi polls/models.py
  1 from django.db import models
  2
  3 class Poll(models.Model):
  4     question = models.CharField(max_length=200)
  5     pub_date = models.DateTimeField('date published')
  6
  7 class Choice(models.Model):
  8     poll = models.ForeignKey(Poll)
  9     choice = models.CharField(max_length=200)
 10     votes = models.IntegerField()

3.1.2 modelの有効化
INSTALLED_APPに「polls」を追加

$ vi settings.py
115 INSTALLED_APPS = (
116     'django.contrib.auth',
117     'django.contrib.contenttypes',
118     'django.contrib.sessions',
119     'django.contrib.sites',
120     'django.contrib.messages',
121     'django.contrib.staticfiles',
122     'polls',

3.1.3 テーブルにmodelを反映

// 実行されるSQLの確認
$ python manage.py sql polls
// テーブル作成
$ python manage.py syncdb

3.1.4 管理サイトの対象にPollを追加

$ vi polls/admin.py
  1 from polls.models import Poll
  2 from django.contrib import admin
  3
  4 admin.site.register(Poll)

3.1.5 投票データの追加
shellからオブジェクトを操作してデータの追加が行う。

$ python manage.py shell
>>> import datetime
>>> from polls.models import Poll, Choice
>>> p = Poll(question="What's up?", pub_date=datetime.datetime.now())
>>> p.save()
>>> p.choice_set.create(choice='Not much', votes=0)
>>> p.choice_set.create(choice='The sky', votes=0)
>>> p.choice_set.create(choice='Just hacking again', votes=0)

3.1.6 管理サイトの有効化
INSTALLED_APPSに「django.contrib.admin」を追加し、ルーティングも有効にします。

$ vi settings.py
115 INSTALLED_APPS = (
116     'django.contrib.auth',
117     'django.contrib.contenttypes',
118     'django.contrib.sessions',
119     'django.contrib.sites',
120     'django.contrib.messages',
121     'django.contrib.staticfiles',
122     'polls',
123     'django.contrib.admin',
124 )
// 管理サイト用のルーティングを追加
$ vi urls.py
  1 from django.conf.urls.defaults import patterns, include, url
  2
  3 from django.contrib import admin
  4 admin.autodiscover()
  5
  6 urlpatterns = patterns('',
  7     url(r'^admin/', include(admin.site.urls)),
  8 )

3.1.7 ウェブサーバ起動
起動後、自分のawsのurlにアクセスするとログイン画面が表示され先ほど追加したユーザでログインできます。
http://ec2-X-X-X-X.ap-northeast-1.compute.amazonaws.com/admin/

$ sudo /home/ec2-user/.django13/bin/python manage.py runserver 0.0.0.0:80

3.1.8 管理サイトのmodel項目の変更
管理サイトのmodelの項目はadmin.pyを編集する事で変更可能です。

// 質問と日付の表示順序を変更
$ vi polls/admin.py
  1 from polls.models import Poll
  2 from django.contrib import admin
  3
  4 class PollAdmin(admin.ModelAdmin):
  5     fields = ['pub_date', 'question']
  6
  7 admin.site.register(Poll,PollAdmin)

// 日付に「Date information」とタイトルバーをつける
$ vi polls/admin.py
  4 class PollAdmin(admin.ModelAdmin):
  5     fieldsets = [
  6         (None,               {'fields': ['question']}),
  7         ('Date information', {'fields': ['pub_date']}),
  8     ]

// htmlクラスを指定して日付を折り畳みに変更
$ vi polls/admin.py
  4 class PollAdmin(admin.ModelAdmin):
  5     fieldsets = [
  6         (None,               {'fields': ['question']}),
  7         ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
  8     ]

// 普通にChoiceを編集対象に追加
$ vi polls/admin.py
 11 from polls.models import Choice
 12 admin.site.register(Choice)

// Pollに関連付けてChoiceを表示
$ vi polls/admin.py
  1 from django.contrib import admin
  2 from polls.models import Poll
  3 from polls.models import Choice
  4
  5 class ChoiceInline(admin.StackedInline):
  6     model = Choice
  7     extra = 3
  8
  9 class PollAdmin(admin.ModelAdmin):
 10     fieldsets = [
 11         (None,               {'fields': ['question']}),
 12         ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
 13     ]
 14     inlines = [ChoiceInline]
 15 admin.site.register(Poll,PollAdmin)

// Choiceの表示を変更
$ vi polls/admin.py
  5 class ChoiceInline(admin.TabularInline):
  6     model = Choice
  7     extra = 3

一覧の表示を変更する場合は以下のように行います。

// 一覧の表示項目のプロパティを追加
$ vi polls/models.py
  1 from django.db import models
  2 import datetime
  3
  4 class Poll(models.Model):
  5     question = models.CharField(max_length=200)
  6     pub_date = models.DateTimeField('date published')
  7
  8     def was_published_today(self):
  9         return self.pub_date.date() == datetime.date.today()
 10     was_published_today.short_description = 'Published today?'

// 一覧の表示項目が変更可能
// list_displayで表示項目
// list_filterでフィルター項目
// search_fieldsで検索項目
// date_hierarchyで日付のページめくり項目
$ vi polls/admin.py
  9 class PollAdmin(admin.ModelAdmin):
 10     list_display = ('question', 'pub_date', 'was_published_today'
 11     list_filter = ['pub_date']
 12     search_fields = ['question']
 13     date_hierarchy = 'pub_date'

3.1.9 管理サイトの見た目の変更
サイトのタイトルを書き換えてみます。
タイトル欄が「taka512 administration」と表示されれば成功です。

$ vi settings.py
108 TEMPLATE_DIRS = (
109     '/home/django13/taka512/templates',
110 )

$ mkdir -p templates/admin
$ cp ~/.django13/lib/python2.7/site-packages/django/contrib/admin/templates/admin/base_site.html templates/admin/
$ vi templates/admin/base_site.html
  7 <h1 id="site-name">{% trans 'taka512 administration' %}</h1>

以上でチュートリアルの管理サイト構築は完了です。