wiki:Django

Django覚え書き

リンク

ドキュメントと違うところ

テンプレートディレクトリ

上記日本語ドキュメントには、テンプレートディレクトリを作成してsettings.pyTEMPLATE_DIRSタプルに書いてくれとある。 これはこれで動くけれど、各アプリケーションのディレクトリ内にtemplatesというディレクトリを作ってもいい。 これは、TEMPLATE_LOADERSに書いてある、「django.template.loaders.app_directories.load_template_source」が提供する機能。

ハマるところ・悩むところ

以下、Djangoの最新版(Subversion版)の話。

バージョンを上げたらエラーが出るようになった。戻しても直らない。

コンパイル済みの *.pyc が残っているから消そう。

rm `find <django installation dir> -name '*.pyc'`

拡張子の無いURL

たとえば以下のようなurls.py

from django.conf.urls.defaults import *
urlpatterns = patterns('',
  (r'^aaaaa$', 'viewA'),
)

aaaaaにアクセスするとaaaaa/にリダイレクトされてしまい、aaaaa/という定義が無いためにエラーになる。 URLのパスの最後の部分に「.」が含まれていないと、これをディレクトリとみなして、「/」つきのURLにリダイレクトする。 この動きはsettings.pyで変更できる。 ドキュメントのAPPEND_SLASHの項を参照。

DBのエントリがみつからない例外

DBのエントリを検索する。たとえばこんな感じ。

  Contact.objects.get(email='tako@ika')

見つからないときにDoesNotExistという例外が発生する。 この例外の正式名称は「モデル名.DoesNotExist」である。 上記の例では、Contact.DoesNotExist。 ドキュメントに小さく書いてあるものだから…探してしまった。

./manage.py reset

models.pyを変更したとき、./manage.py resetを実行しなければならないことがある。 どんなとき必要で、どんなとき不要なのか、いまいちわからない。

DateTimeField

null=Trueを指定しない場合、DBはNOT NULLで定義される。 これに対して、blank=Trueにすると、NULLのエントリを書き込もうとする。エラーになる。

nullblank結果
FalseFalse空にすることができない。意図したことならこれでいいが。
FalseTrueNOT NULLのフィールドにNULLを書き込もうとしてエラー。
TrueFalse管理画面の追加フォームで追加できない。
TrueTrue空にすることができる。

バグ?仕様?

PostgreSQLに接続できない

Djangoの問題というよりPostgreSQLの設定の話。 うちはDebianが主流ですが、DebianでPostgreSQLをインストールすると、 インストールしただけでは「Linuxのユーザ名とPostgreSQLのユーザ名が同じであることを要求する」設定になっている。 /etc/postgresql/pg_hba.confの先頭のコメントが終わったあたり(または一番先頭でもいい)に、以下の行を挿入する。

# TYPE  DATABASE    USER        IP-ADDRESS        IP-MASK           METHOD
local   DB名         ユーザ名                                                md5

ここで、DB名は、Djangoで使うために作成するデータベース名。ユーザ名は、Djangoがアクセスするためのユーザ名。いずれも、settings.pyDATABASE_*項目に設定する名前。

テスト用サーバにアクセスできない

テスト用サーバを起動するには、./manage.py runserver 0.0.0.0:8000とする。 0.0.0.0が重要。8000の部分は好きなポート番号に変える。 チュートリアルのように./manage.py runserverとか./manage.py runserver 8000などとすると、 サーバと異なるマシンからアクセスできない。 つまり、Linuxマシンでサーバを動かし、ウィンドウズからアクセスするという使い方ができない。

初期の管理者パスワード

初期の管理者IDとパスワードは、./manage.py syncdbを初めて実行したときに作成される。 古いドキュメントでは./manager.py createsuperuserを実行しろと書いてあるが、現在は使えない。 詳しくは、 authentication.txtに書いてある。