2010年10月30日土曜日

Django モデル・フォームセットの利用

Djangoのモデル・フォームセットを利用するには、modelformset_factory を使用する。
def modelformset_factory(model, form=ModelForm,
             formfield_callback=lambda f: f.formfield(),
             formset=BaseModelFormSet,
             extra=1, can_delete=False, can_order=False,
             max_num=0, fields=None, exclude=None):
 
#   パラメーター説明
    model       モデル
    form        フォーム
    max_num     データーの表示数(設定しないと表示は制限しない)
    extra       新規入力フォーム表示数
    can_delete  Trueを設定すると削除可能
model にはモデルを、他は formset_factory のパラメーターと同じ。

モデル・フォームセットは、モデルからだけでなくモデル・フォームからもフォームセットを生成できる。
以下、生成例を示す。

  1. モデル・フォームを利用してモデル設定を変更
    class Item(models.Model):
        item_code = models.CharField(u'商品コード',max_length=255,unique=True)
        item_name = models.CharField(u'商品名',max_length=255)
        price = models.PositiveIntegerField(u'価格')
        start_date = models.DateField(u'掲載開始日',null=True);
    
    class ItemForm(ModelForm):
        start_date = forms.DateField(label=u'日付',widget=adminwidget.AdminDateWidget)
     
        class Meta:
            model = Item
    
    最初に定義したモデル設定を変更して、start_date フィールドに widget の設定を行っている。


  2. modelformset_factory でモデル・フォームセットを生成する。

    ItemFormSet = modelformset_factory(model=Item, form=ItemForm,
                         max_num=5, extra=1,
                         can_delete=True)
    
    model と form の各パラメーターに定義したモデル及びモデル・フォームを設定する。

    この他、fields/exculde といったパラメーターがある。
    fields にフィールド名をタプルで指定すると、指定したフィールドだけがフォームセットで使用される。excude にフィールド名をタプルで指定すると、指定したフィールドがフォームセットで除外される。

    これらを使えば、モデル・フォームの fields/exculde 設定と同様の事が可能。


参考サイト
Djangoドキュメント  モデルからフォームを生成する
Djangoドキュメント  フォームセット(formsets)