Django再入門 RandomNoteを作る vol.1 下準備

  • 3月 07, 2007 01:00

Djangoの勉強にあたって何かいい題材はないかと探していたのですが まちゅダイアリー - 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で開くとこのようになります。

http://farm1.static.flickr.com/84/277870544_6d11ee7185.jpg

では次に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へアクセスしてみましょう。

http://farm1.static.flickr.com/88/277914769_933fe44b6f.jpg

このように動いていますね。

では管理ページを使えるようにしましょう。 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をブラウザで開くと

http://farm1.static.flickr.com/108/277917725_04589016dc.jpg

管理画面が開きます。先ほどのsuperuserで設定したユーザー名とパスワードを入力すると

http://farm1.static.flickr.com/92/277919672_f781056707.jpg

一番下にrandomnote アプリの Pagesという欄ができてますね。 追加ボタンを押すと記入できるフォームが出来てます。 bodyはblank=Falseにしているので何も書かずに保存ボタンを押してみましょう。

ちゃんと怒られますね。

では適当な文章を入力して保存してみましょう。 私は「テストですはたしてどのようにこのページが保存されるのでしょうか??見物ですね」 と入力しました。

http://farm1.static.flickr.com/99/277952646_a9266d0702.jpg

ここで問題発生。 def __str__(self): でbody[:20] でbodyの頭から20文字を返すように指定したのですが、 unicode文字数で数えてしまっていますね。

これは今後の課題にして次へ行きましょう

とりあえずここまでで、Djangoの設定とModelの設定、管理画面での確認までできました。 Modelに blank=False と、設定するだけでバリデーションが効くのはDjangoの良いところじゃないでしょうか