django の評価
こちら方面にも手を出してみる事に。
環境構築
とりあえず、Win32環境に最小限の Django 環境をインストールする を見つつ、windows なソレに環境構築。
3 分で、と謳ってある通り、さくっと環境できた。
チュートリアルを試してみる
developerworks の Python 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 の設定が正しければ、引数の文字列がブラウザに表示、という事のようです。正常動作を確認。
で、次のバージョン以降はテンプレートが無いと動作しない、との事にて別途。