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 のパラメーターと同じ。
モデル・フォームセットは、モデルからだけでなくモデル・フォームからもフォームセットを生成できる。
以下、生成例を示す。
- モデル・フォームを利用してモデル設定を変更
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 の設定を行っている。 - 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)