気ままなタンス*プログラミングなどのノートブック

プログラミングやRPGツクール、DTM、VOCALOIDについてのんびり書きます。

【Djangoメモ】ModelFormを継承したFormでフォームセットを使う

DjangoのForm関係のお話。

・フォームセットの作成

 フォームセットを利用するには、django.forms.formsetsモジュールの
 formset_factory関数でFormクラスを指定する

""" forms.py """
from django import forms
from django.forms import formsets

from any_app.models import Any

class AnyForm(forms.ModelForm):
    class Meta:
        model = Any

AnyFormSet = formsets.formset_factory(AnyForm, extra=3)

・ビューでのフォームセットの利用

 formset_factory関数で作成したフォームセットクラスのインスタンスを作成して、
 コンテキストに設定する。

""" views.py """
from any_app.forms import *
from django.shirtcuts import render_to_response
from django.template import RequestContext

def any_view(request):
    any_form_set = AnyFormSet()
    return render_to_response("any_template.html",
                              dict(any_form_set=any_form_set),
                              RequestContext(request))

 なお、formset_factoryのオプション引数で (formset=)を指定した場合、
 そのFormSetを親としたFormSetを返却する模様。
 デフォルトでは、BaseFormSetが指定されている
 →django.forms.formsets.py 414行目あたり

・テンプレート内でのフォームの利用

<!-- any_template.html -->
<!DOCTYPE html>
<html>
<head lang="ja">
    <meta charset="UTF-8">
    <title>AnyModelFormSet</title>
</head>
<body>
{{ any_form_set }}
</body>
</html>
個人的に面白かったところ
 formsets = AnyFormSet() # インスタンスを作成
  print formsets # フォームセットを表現するためのHTMLが出力される