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>
以上でチュートリアルの管理サイト構築は完了です。