Changes between Version 4 and Version 5 of spa00


Ignore:
Timestamp:
07/02/07 04:51:23 (12 years ago)
Author:
ymasuda
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • spa00

    v4 v5  
    1 = SPA00(第0回Python温泉)に参加しました = 
     1{{{ 
     2#!rst 
     3 
     4================================================ 
     5SPA00(第0回Python温泉)に参加しました 
     6================================================ 
    27 
    382007年6月22-24に伊豆で行われたPythonユーザの合宿、SPA00(通称Python温泉)に、 
    49弊社の金本、吉田、中川、中居、増田が参加しました。 
    510 
    6 == 増田のレポート == 
     11増田のレポート 
     12======================= 
     13 
     14* 弊社から無線LAN環境を提供しようと意気込んでAirMacExtremeを持ち込んだのですが、会議室のインフラが 
     15  無線LANのみ、かつWDS非対応で断念。2個もっていけばよかった... 
     16* ほとんどの時間をPython/Django関係の物書きに費やしました。Djangoユーザ率が高かったので、その場で 
     17  質問して回答をもらえて助かりました。「Django組」のみなさんありがとう! 
     18* 途中、newformsの使い方(form_for_model, form_for_instance)の使い方で質問が出たので簡単にレクチャー。 
     19 
     20newformsのキモ 
     21------------------- 
     22 
     23* newforms でフォームクラスを作るには、2つの方法がある。 
     24 
     25 - Form クラスをサブクラス化して、カスタムのフォームクラスを作る。検索フォームのように、特定のモデルクラスに 
     26   関わらないフォームはこっちの方法を使う。 
     27 - form_for_model や form_for_instance を使って、モデルやインスタンスを introspection させてフォームクラスを生成させる。 
     28   モデルインスタンスのCreate/Update/Deletionに絡むインタフェースは、こっちを使う。 
     29 
     30* フォームクラスのインスタンスを生成するには、2つの方法がある。 
     31 
     32 - 引数を渡さずにFormインスタンスを生成すると、フォームは **非束縛(特定のデータに結びついていない)フォーム** になる。 
     33   非束縛フォームは、いわば初めてフォームの入ったページを表示するときの内容を出力するためのフォーム。 
     34   *非束縛フォームはバリデーションしないし、is_validとか clean() しても意味がない。* 
     35 
     36 - 引数(辞書とか request.POST/GET) を渡してインスタンスを生成すると、フォームは  
     37   **束縛(特定のデータに結びつけられた)フォーム** になる。束縛フォームは、フォームインスタンスを生成するときに渡された 
     38   データ(束縛データ)を検証して、Pythonオブジェクトに変換する。 
     39   (一般に、「バリデーション」過程には、人間のようなデータソースから入力されたデータの検証を行うとともに、コントローラ 
     40   側でハンドリング可能な形式に(たとえば文字列から数値へ)変換する役割がある)。 
     41   束縛フォームに対して is_valid を参照するか、clean() を呼び出すと検証が行われる(同時に、変換後の値が  
     42   clean_data(SVN版ではcleaned_data)に入る。 
     43   **(0.96と開発版は名前が違うので、互換性を持たせたければ clean() を呼んで辞書を帰させるといいよ。)** 
     44 
     45 - というわけで、newformsを使ったフォームのロジックは基本的に以下のようになる:: 
     46 
     47        class MyForm(forms.Form): 
     48            ... (適当にフォームクラス定義) 
     49 
     50        def my_form_view(request): 
     51            if request.POST: 
     52                form = MyForm(reqest.POST)  # ここで束縛フォームを作っている。 
     53                if form.is_valid: 
     54                    cleaned_values_dict = form.clean() 
     55                    ... 
     56                    return HttpResponseRedirect(...) # (フォーム処理がうまくいったので)結果のページを表示したり、リダイレクトで飛ばしたりする。 
     57            else: 
     58                form = MyForm() # POSTデータがないから非束縛フォームを作る。 
     59            # Context の form には、(1)検証エラーに失敗した束縛フォームか、(2)POSTデータの入っていない非束縛フォームが入っている。 
     60            # (1) だとバリデーションエラー付きのHTMLフラグメントが、 (2) だと初期値の入った HTML フラグメントが出力される。 
     61            return render_to_response(template_name, Context(dict(form=form)) 
     62 
     63 - form_for_model と form_for_instance は CRUD に使う。 
     64 
     65   - CReate の場合には、まだ編集すべきインスタンスがないから、フォームの初期値はインスタンス生成時のデフォルト値を 
     66     使うのが適当だよね?つまり、 form_for_model を使う。 
     67   - Update/Delete の場合には、編集すべきインスタンスの値がフォームに入っているべき。だから、 form_for_instance を使う。 
     68 
     69   - form_for_model/form_for_instance を使ってると、フィールドの一部で期待はずれのフォームウィジェットが出てくる。 
     70     この問題は、 **formfield_callback を定義して回避する** といいよ。でも、めんどくさい! 
     71 
     72- APIを定義すると、ハンドラリストとDispatcherを返せるインスタンスを生成できるようなメタクラスのアイデア。 
     73  まだ実装してない。(その場で話を聞いていた人のblogを読む限り、内容が非常に誤解されているようだ) 
     74 
     75}}}