View All Posts. MiCHiLU.com powered by Django ;-)

[Django]: Django和訳ドキュメント sync to r5832

Django オンラインドキュメント和訳 更新。 Revision 5754:5832 (2007/08/10). 「User.set_unusable_password()」「django.mp3」「models: CharField, help_text」「newforms: FileField」「テストメソッドを実行する」についての記述が更新されています。

以下、 主な変更です。

ユーザ (User)

メソッド

  • set_unusable_password() -- 開発バージョンの Django で登場した機能です。 ユーザにパスワード未設定のマークをつけます。パスワード未設定の状態は、 パスワードが空の文字列である状態と区別されます。パスワード未設定状態 のユーザに対して check_password() を呼び出すと、決して True を返しません。このメソッドは User オブジェクトを直接保存しません。

    この機能は、 LDAP ディレクトリのような外部の認証ソースを使ってアプリ ケーションの認証を行いたい場合に必要です。

  • has_usable_password() -- 開発バージョンの Django で登場した機能です。 ユーザに対して set_unusable_password() が呼び出され、パスワード未 設定状態である場合に False を返します。

マネジャ関数

パスワードを指定しなかった場合、 set_unusable_password() を呼び出 します。

"Django" とはどういう意味で、どのように発音するのですか?

正しい発音の音声ファイル を作成してあるので参考にしてください。

CharField

ベテラン Django ユーザへの注意: Django 内での一貫性を持たせるため、 引数名 maxlengthmax_length に変わりました。これまで通り maxlength 引数は使えますが、今後は max_length を使うよう勧めます。

help_text

この値は admin インタフェース上に表示されるときに HTML エスケープされ ない ので注意してください。必要ならば、下記の例のように help_text に HTML を含めてもかまいません

help_text="<em>YYYY-MM-DD</em> の形式で記入してください。"

アップロードされたファイルをフォームに結びつける

開発版の Django で新たに追加された機能です

FileFieldImageField といったフィールドの入ったフォームの扱いは、 通常のフォームより少しだけ複雑です。

まず、フォームからファイルをアップロードさせるには、 <form> エレメント で enctype"multipart/form-data" に設定されていなければなりませ ん

<form enctype="multipart/form-data" method="post" action="/foo/">

次に、フォームを使う場合、ファイルデータをフォームに結びつけなければ なりません。ファイルデータは通常のフォームデータとは分けて扱われるので、 フォームに FileFieldImageField が入っている場合、束縛フォームを 作るには、第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()

FileField

開発版の Django で新たに追加された機能です

  • デフォルトのウィジェット: FileInput
  • 空のフォームデータに対する値: None
  • Python データへの正規化: ファイルコンテンツとファイル名を一つのオブジェ クトとしてラップする UploadedFile オブジェクト。
  • フォームに結びつけられているファイルデータが空でないか検証します。

UploadedFile オブジェクトには、以下の 2 つの属性があります:

引数 説明
filename クライアントがアップロード時に指定したファイルの名前です。
content ファイルの内容が入った配列です。

UploadedFile の文字列表現は filename 属性の値そのものです。

FileField をフォームで使う場合、 フォームにファイルデータを束縛する のを忘れないようにしてください。

ImageField

開発版の 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_labelsNone の場合,テストランナは INSTALLED_APPS に 登録されている全てのアプリケーションからテストを探して実行します.

Mon, 20 Aug 2007 23:24:07 +0900 source edit
Creative Commons License
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.1 Japan License.
View All Posts. MiCHiLU.com powered by Django ;-)