Django覚え書き
リンク
ドキュメントと違うところ
テンプレートディレクトリ
上記日本語ドキュメントには、テンプレートディレクトリを作成してsettings.pyのTEMPLATE_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のエントリを書き込もうとする。エラーになる。
| null | blank | 結果 |
| False | False | 空にすることができない。意図したことならこれでいいが。 |
| False | True | NOT NULLのフィールドにNULLを書き込もうとしてエラー。 |
| True | False | 管理画面の追加フォームで追加できない。 |
| True | True | 空にすることができる。 |
バグ?仕様?
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.pyのDATABASE_*項目に設定する名前。
テスト用サーバにアクセスできない
テスト用サーバを起動するには、./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に書いてある。
