django の評価

こちら方面にも手を出してみる事に。

環境構築

とりあえず、Win32環境に最小限の Django 環境をインストールする を見つつ、windows なソレに環境構築。
3 分で、と謳ってある通り、さくっと環境できた。

チュートリアルを試してみる

developerworksPython Webフレームワーク、第1回: DjangoとPythonを使ってWeb開発を行う を試してみる。

プロジェクト作成

環境の構築は完了している (はずな) んで、プロジェクト作成。

d:\django>django-admin.py startproject djproject

d:\django>
アプリケーションの作成

次、アプリケーションの作成。

d:\django>cd djproject

d:\django\djproject>python manage.py startapp jobs

d:\django\djproject>

コマンドラインのソレがコピペできんから微妙。やっぱ Linux なソレに環境作ろうかなぁ。(を

syncdb

ええと、とりあえず d:\django\setting.py をメモ帳に drop。DATABASE_ENGINE と DATABASE_NAME を以下に修正

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = 'd:/django/djproject/djproject.db'

で上書き保存後に、syncdb 実行

d:\django\djproject>python manage.py syncdb
(出力は略
d:\django\djproject>

無事終了。どこかに書いてあったんですが、ディレクトリの区切り文字は '/' でないと駄目、と書いてありました。

INSTALLED_APPSフィールドにエントリーを追加

と、一緒にモデルも作成。まず、チュートリアルの記述通りにエントリ追加。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'djproject.jobs',
)

追加した後、上書き保存。次は model 作成。jobs\models.py に以下のソレを追加 (最初の一行は最初から記述されております)

from django.db import models

class Location(models.Model):
    city = models.CharField(maxlength=50)
    state = models.CharField(maxlength=50, null=True, blank=True)
    country = models.CharField(maxlength=50)

    def __str__(self):
        if self.state:
            return "%s, %s, %s" % (self.city, self.state, self.country)
        else:
            return "%s, %s" % (self.city, self.country)

class Job(models.Model):
    pub_date = models.DateField()
    job_title = models.CharField(maxlength=50)
    job_description = models.TextField()
    location = models.ForeignKey(Location)

    def __str__(self):
        return "%s (%s)" % (self.job_title, self.location)

で、上記を上書きしたら以下のコマンドでスキーマの確認ができるみたい。

d:\django\djproject>python manage.py sql jobs
(出力は略
d:\django\djproject>

略した出力によると、state の定義で出てきてる null=True とか blank=True という指定は許容する、という意味になるらしい。あるは __str__ は java で言う toString みたいなナニである、との事。Admin ツールにおいてこのメソッドを頻繁に使うとの事なので、定義しておいた方が良いらしい。

で、DB への反映は syncdb で良い、と。

d:\django\djproject>python manage.py syncdb
(出力は略
d:\django\djproject>

jobs_job テーブルと jobs_location テーブルが追加された模様。これって rails の migrate みたいで良いな。ただ、migrate はバージョンの巻戻しができるけど、この方法しかないんだとしたら、それは不可能か。

管理者ツール

チュートリアルには DB にアクセスする方法なんかが書いてあるんですがスルー。とりあえず、作ってみる。まず、settings.py の修正。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'djproject.jobs',
    'django.contrib.admin',
)

django.contrib.admin の追加。次は urls.py の修正。デフォルトは以下。

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    # Example:
    # (r'^djproject/', include('djproject.apps.foo.urls.foo'))

    # Uncomment this for admin:
#     (r'^admin/', include('django.contrib.admin.urls')),
)

いっちゃん下の行を uncomment せい、と書いてあるな。で、syncdb する、と。

d:\django\djproject>python manage.py syncdb
(出力は略
d:\django\djproject>

で、テストサーバを起動、と。

d:\django\djproject>python manage.py runserver
Validating models...
0 errors found.

Django version 0.95 (post-magic-removal), using settings 'djproject.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.

ブラウザで http://localhost:8000/ を開いてみる。404 Not Found との返答。
あ、url が違う。http://localhost:8000/admin ですか。リトライしてみるとログイン画面が出てきた。ただし、_まだ、どのモジュールも利用できません_とある。

えーと、チュートリアルには_サブクラス_と書いてあるが java で言うインナークラスみたいな形で定義すれば良いのかな。Location でやってみる。

class Location(models.Model):
    city = models.CharField(maxlength=50)
    state = models.CharField(maxlength=50, null=True, blank=True)
    country = models.CharField(maxlength=50)

    def __str__(self):
        if self.state:
            return "%s, %s, %s" % (self.city, self.state, self.country)
        else:
            return "%s, %s" % (self.city, self.country)

    class Admin:
        list_display = ("city", "state", "countr")

で、syncdb すれば良いのかな??
とりあえず何もせずにサーバを再起動してみる。リロードしたら項目が追加されています。Locations なリンクをクリックしてみると 0 locations と表示。CRUD なインターフェースはこれで OK ってコトみたいです。楽ちんスギ。

Add location から試しに何も入力せずに SAVE ボタンをクリックしたら validate も動作している様子。メセジ英語だな。でも SD な本では国際化なソレも対応ずみ、とあるから何とかなるはずだな (本当??

URL スキームを設計する

このあたりを読んでみて rails の controller が view で view が template というマッピングで良いのかな、というのが第一印象 (を
# ってチュートリアルにも記述あり

とりあえず一番最後に書いてある方法で実装。まず、djproject\urls.py から

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^admin/', include('django.contrib.admin.urls.admin')),
    (r'^jobs/', include('djproject.jobs.urls')),
)

で、次に djproject\jobs\urls.py を新規に作成

from django.conf.urls.defaults import *

urlpatterns = patterns('djproject.jobs.views',
    (r'^$', 'index'),
    (r'^(?P<object_id>\d+)/$', 'detail'),
)

とりあえず view がまだ無いので動かない、と。

ビューの実装

以下を試してみよ、とある。(jobs\views.py)

from django.http import HttpResponse

def index(request):
    return HttpResponse("Job Index View")

urls.py と jobs\urls.py と jobs\views.py の設定が正しければ、引数の文字列がブラウザに表示、という事のようです。正常動作を確認。

で、次のバージョン以降はテンプレートが無いと動作しない、との事にて別途。