Django オンラインドキュメント和訳 更新。 Revision 5754:5832 (2007/08/10). 「User.set_unusable_password()」「django.mp3」「models: CharField, help_text」「newforms: FileField」「テストメソッドを実行する」についての記述が更新されています。
以下、 主な変更です。
set_unusable_password() -- 開発バージョンの Django で登場した機能です。 ユーザにパスワード未設定のマークをつけます。パスワード未設定の状態は、 パスワードが空の文字列である状態と区別されます。パスワード未設定状態 のユーザに対して check_password() を呼び出すと、決して True を返しません。このメソッドは User オブジェクトを直接保存しません。
この機能は、 LDAP ディレクトリのような外部の認証ソースを使ってアプリ ケーションの認証を行いたい場合に必要です。
has_usable_password() -- 開発バージョンの Django で登場した機能です。 ユーザに対して set_unusable_password() が呼び出され、パスワード未 設定状態である場合に False を返します。
パスワードを指定しなかった場合、 set_unusable_password() を呼び出 します。
正しい発音の音声ファイル を作成してあるので参考にしてください。
ベテラン Django ユーザへの注意: Django 内での一貫性を持たせるため、 引数名 maxlength は max_length に変わりました。これまで通り maxlength 引数は使えますが、今後は max_length を使うよう勧めます。
この値は admin インタフェース上に表示されるときに HTML エスケープされ ない ので注意してください。必要ならば、下記の例のように help_text に HTML を含めてもかまいません
help_text="<em>YYYY-MM-DD</em> の形式で記入してください。"
開発版の Django で新たに追加された機能です
FileField や ImageField といったフィールドの入ったフォームの扱いは、 通常のフォームより少しだけ複雑です。
まず、フォームからファイルをアップロードさせるには、 <form> エレメント で enctype が "multipart/form-data" に設定されていなければなりませ ん
<form enctype="multipart/form-data" method="post" action="/foo/">
次に、フォームを使う場合、ファイルデータをフォームに結びつけなければ なりません。ファイルデータは通常のフォームデータとは分けて扱われるので、 フォームに FileField や ImageField が入っている場合、束縛フォームを 作るには、第2引数にファイルデータを渡さねばなりません。ContactForm に mugshot という名前の ImageField を組み込んだ場合、下記のようにして、 顔写真 (mugshot) のファイルデータをフォームに結びつけます
# 画像ファイルフィールドつきの束縛フォーム
>>> data = {'subject': 'hello',
... 'message': 'Hi there',
... 'sender': 'foo@example.com',
... 'cc_myself': True}
>>> file_data = {'mugshot': {'filename':'face.jpg'
... 'content': <file data>}}
>>> f = ContactFormWithMugshot(data, file_data)
実践的には、 request.FILES をファイルデータのソースとして指定することに なるでしょう (request.POST をフォームデータのソースにするのと同様です)
# Bound form with an image field, data from the request
>>> f = ContactFormWithMugshot(request.POST, request.FILES)
非束縛フォームの構築は通常通りで、フォームデータとファイルデータの 両方 を省略します
# Unbound form with a image field
>>> f = ContactFormWithMugshot()
開発版の Django で新たに追加された機能です
- デフォルトのウィジェット: FileInput
- 空のフォームデータに対する値: None
- Python データへの正規化: ファイルコンテンツとファイル名を一つのオブジェ クトとしてラップする UploadedFile オブジェクト。
- フォームに結びつけられているファイルデータが空でないか検証します。
UploadedFile オブジェクトには、以下の 2 つの属性があります:
引数 説明 filename クライアントがアップロード時に指定したファイルの名前です。 content ファイルの内容が入った配列です。
UploadedFile の文字列表現は filename 属性の値そのものです。
FileField をフォームで使う場合、 フォームにファイルデータを束縛する のを忘れないようにしてください。
開発版の Django で新たに追加された機能です
- デフォルトのウィジェット: FileInput
- 空のフォームデータに対する値: None
- Python データへの正規化: ファイルコンテンツとファイル名を一つのオブジェ クトとしてラップする UploadedFile オブジェクト。
- 空でないファイルデータがフォームに結びつけられていて、かつその内容が PIL で扱えるファイル形式であるか検証します。
ImageField を使いたい場合、 Python Imaging Library をインストールしてお かねばなりません。
FileField をフォームで使う場合、 フォームにファイルデータを束縛する のを忘れないようにしてください。
モデル内で多対多のリレーションを定義している場合、 commit=False を使っ た場合の副作用がもう一つ生じます。モデルが多対多のリレーションを持ち、フォー ムを保存するときに commit=False を指定すると、その時点で、 Django は多 対多のリレーション先のオブジェクトを表現するフォームデータを保存できなくな ります。これは、データベース上にリレーション元のインスタンスが保存されてい ないため、多対多のデータを保存できないからです。
この問題を回避するため、 Django は form_for_model で作成されたフォーム を commit=False で保存すると、 save_m2m() というメソッドをフォーム に追加します。フォームを手動で保存した後で、 save_m2m() を呼び出して、 多対多のフォームデータを保存できます
# POST データからフォームインスタンスを生成します。
>>> f = AuthorForm(request.POST)
# フォームから新たにインスタンスを生成しますが、保存はしません。
>>> new_author = f.save(commit=False)
# 作成した new_author を色々と操作します。
...
# インスタンスを保存します。
>>> new_author.save()
# フォームの多対多の情報を保存します。
>>> f.save_m2m()
save_m2m() を呼び出す必要があるのは、あくまでも save(commit=False) した時だけです。単にフォームの save() を呼び出した場合には、多対多のデー タを含む全てのデータが保存されるので、特に追加で何かのメソッドを呼び出す必 要はありません。例えば
# POST データからフォームインスタンスを生成します。
>>> f = AuthorForm(request.POST)
# 新たな Author インスタンスを生成して保存します。これ以上特に必要な
# 操作はありません。
>>> new_author = f.save()
開発バージョンの Django で新たに追加された機能: 単体テストを実行する際,どのテストを実行するかを指定できます.あるアプリケー ション用のテストケースを実行する場合 (例えば,上で解説した AnimalTestCase の場合) は,コマンドラインにテストケースの名前を追加してください
$ ./manage.py test animals.AnimalTestCase
開発バージョンの Django で新たに追加された機能: テストケース中の個別のテストメソッドを実行したければ,メソッド名を指定して ください
$ ./manage.py test animals.AnimalTestCase.testFluffyAnimals
run_tests(test_labels, verbosity=1, interactive=True, extra_tests=[])
開発バージョンの Django で新たに追加された機能: test_labels には, 実行したいテストを表す文字列 (ラベル) のリストを指定します.ラベルは以下 の 3 つの形式で指定できます:
- app.TestCase.test_method - テストケース中の個別のテストメソッドを 実行します.
- app.TestCase - テストケース中の全てのテストメソッドを実行します.
- app - アプリケーション中の全てのテストを探して実行します.
test_labels が None の場合,テストランナは INSTALLED_APPS に 登録されている全てのアプリケーションからテストを探して実行します.
