Django再入門 RandomNoteを作る vol.1 下準備
March 07, 2007 at 01:00 AM | View CommentsDjangoの勉強にあたって何かいい題材はないかと探していたのですが まちゅダイアリー - Rails に(再)挑戦してみようかと思います。 Railsがよくわからないので途中脱線しながらになると思いますが、がんばって完成させてみたいと思います。
Djangoのインストール、MySQLのインストールは済みの状態からスタートします。 プロジェクトを作りたいPATHにて
django-admin.py startproject myproject
でmyprojectというプロジェクトを作ります。
cd myproject
でmyporjectのディレクトリに移動すると以下のファイルができています。
__init__.py manage.py settings.py urls.py
djangoの場合はプロジェクト内に複数のアプリを持つことができるので、randomnoteというアプリを作りましょう
python manage.py startapp randomnote
randomnoteというディレクトリと配下に
randomnote/__init__.py randomnote/models.py randomnote/views.py
というファイルができます。
__init__.py は randomnote.models.__クラス名__ のようにディレクトリ.ファイル名 でPythonからアクセスできるにするためのものです。
manage.pycのようにpycという拡張子のファイルができるが、これはコンパイルされたファイル。 変更がないかぎり、pyじゃなくpycが自動的に使われます。 つまり特に意識しなくて良いし、subversionなどに含める必要がありません。
TextMateで開くとこのようになります。
では次にMySQLに使用するデータベースを作りましょう。 djangoはutf-8を扱うのでdefault character set utf8を付けます。
mysql> create database myproject default character set utf8;
Query OK, 1 row affected (0.50 sec)
次にsettings.pyの設定を行います。 settings.pyは設定ファイルですがPythonのプログラムそのものなので必要なモジュールをインポートできます。 ではいろいろ使うのでosモジュールをインポートしておきます
'settings.py'
#dbの設定
DATABASE_ENGINE = 'mysql'
DATABASE_NAME = 'myproject'
DATABASE_USER = 'your_username' #あなたのユーザー名
DATABASE_PASSWORD = '' #パスワード
DATABASE_HOST = ''
DATABASE_PORT = ''
#タイムゾーンと日本語化の対応
TIME_ZONE = 'Asia/Tokyo'
LANGUAGE_CODE = 'ja'
#テンプレートファイルを置くディレクトリの設定
TEMPLATE_DIRS = (
os.path.join(os.getcwd(), "templates"),
)
# 管理画面とrandomnoteアプリの設定
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.admin',
'randomnote', #'myproject.randomnote', より後々幸せになれるので
)
次にテンプレートファイルを置くディレクトリをmyprojectの下に作っておきましょう
mkdir templates
テンプレートファイルは TEMPLATE_DIRSで設定した場所ならどこでも探しにきてくれますが、 通常はプロジェクトの下が良いでしょう。
とりあえずの準備はこれで終了です。
models.pyの設定
randomnote/models.pyにモデルを作りましょう bodyだけで良いらしい。 __str__はインスタンスがprintされたときに表示される文字 class Adminを設定しておくと管理画面で編集できるようになります。
'randomnote/models.py'
from django.db import models
class Page(models.Model):
body = models.TextField(blank=False)
def __str__(self):
return self.body[:20]
class Admin:
pass
#(注意: sqliteでself.body[:20]で日本語を無理やりスライスするとDBが壊れる症状がでます。
def __str__(self):
return unicode(self.body, 'utf8')[:20].encode('utf8')
としてください。
つぎに
python manage.py syncdb
でデータベースに今作ったModelを反映させましょう プロジェクトの最初はいろいろなものが作られる&スーパーユーザーの設定を聞かれます
Creating table auth_message
Creating table auth_group
Creating table auth_user
Creating table auth_permission
Creating many-to-many tables for Group model
Creating many-to-many tables for User model
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log
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 '____'): your superusername
E-mail address: your@email.adress
Password:
Password (again):
Superuser created successfully.
Adding permission 'message | Can add message'
Adding permission 'message | Can change message'
Adding permission 'message | Can delete message'
Adding permission 'group | Can add group'
Adding permission 'group | Can change group'
Adding permission 'group | Can delete group'
Adding permission 'user | Can add user'
Adding permission 'user | Can change user'
Adding permission 'user | Can delete user'
Adding permission 'permission | Can add permission'
Adding permission 'permission | Can change permission'
Adding permission 'permission | Can delete permission'
Adding permission 'content type | Can add content type'
Adding permission 'content type | Can change content type'
Adding permission 'content type | Can delete content type'
Adding permission 'session | Can add session'
Adding permission 'session | Can change session'
Adding permission 'session | Can delete session'
Creating example.com Site object
Adding permission 'site | Can add site'
Adding permission 'site | Can change site'
Adding permission 'site | Can delete site'
Adding permission 'log entry | Can add log entry'
Adding permission 'log entry | Can change log entry'
Adding permission 'log entry | Can delete log entry'
Creating table randomnote_page
Adding permission 'page | Can add page'
Adding permission 'page | Can change page'
Adding permission 'page | Can delete page'
と、さまざまなテーブルがデータベースにできます。 ちょっとみてみましょう
python manage.py dbshell
で対話式にMySQLを操作できます。履歴や補完が効くので通常のものより便利です
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
テーブルを確認
mysql> show tables;
+----------------------------+
| Tables_in_myproject |
+----------------------------+
| auth_group |
| auth_group_permissions |
| auth_message |
| auth_permission |
| auth_user |
| auth_user_groups |
| auth_user_user_permissions |
| django_admin_log |
| django_content_type |
| django_session |
| django_site |
| randomnote_page |
+----------------------------+
12 rows in set (0.00 sec)
一番したのテーブルが今作ったモデルのテーブル アプリ名_モデル名のテーブルになります
カラムを確認
mysql> show columns from randomnote_page;
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| body | longtext | NO | | NULL | |
+-------+----------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
と、bodyの他にidが自動的に作られてます。 この辺はおなじみですね。
ではテスト環境を動かしてみましょう
python manage.py runserver
Validating models...
0 errors found.
Django version 0.96-pre, using settings 'myproject.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
でブラウザでlocalhost:8000へアクセスしてみましょう。
このように動いていますね。
では管理ページを使えるようにしましょう。 urls.pyの # (r'^admin/', include('django.contrib.admin.urls')),
の #を消しましょう
'urls.py'
from django.conf.urls.defaults import *
urlpatterns = patterns('',
# Example:
# (r'^myproject/', include('myproject.apps.foo.urls.foo')),
# Uncomment this for admin:
(r'^admin/', include('django.contrib.admin.urls')),
)
で、localhost:8000/adminをブラウザで開くと
管理画面が開きます。先ほどのsuperuserで設定したユーザー名とパスワードを入力すると
一番下にrandomnote アプリの Pagesという欄ができてますね。 追加ボタンを押すと記入できるフォームが出来てます。 bodyはblank=Falseにしているので何も書かずに保存ボタンを押してみましょう。
ちゃんと怒られますね。
では適当な文章を入力して保存してみましょう。 私は「テストですはたしてどのようにこのページが保存されるのでしょうか??見物ですね」 と入力しました。
ここで問題発生。 def __str__(self): でbody[:20] でbodyの頭から20文字を返すように指定したのですが、 unicode文字数で数えてしまっていますね。
これは今後の課題にして次へ行きましょう
とりあえずここまでで、Djangoの設定とModelの設定、管理画面での確認までできました。 Modelに blank=False と、設定するだけでバリデーションが効くのはDjangoの良いところじゃないでしょうか