1つのモデルの複数レコードを編集するのなら、ModelFormのフォームセットを生成するといいのだけど、modelformset_factoryという関数があるのでそちらを使用してみる。
ドキュメントに載っていないのでバージョンアップで動かなくなる可能性あり。
modelformset_factoryは、BaseModelFormSetを継承してModelFormに適したフォームセットクラスを生成してくれる。
試したバージョンは、Python3.3、Django1.6.1
コード例
myapp/forms.py
from django import forms from django.forms import formsets from django.forms import models from .models import Item # モデルからModelFormSetの生成を行うmodelformset_factoryを使う場合 ItemFormSet = models.modelformset_factory(Item, extra=1) # modelformset_factoryを使わない場合 class ItemForm(forms.ModelForm): class Meta: model = Item ItemFormSet2 = formsets.formset_factory(ItemForm, extra=1, formset=models.BaseModelFormSet) ItemFormSet2.model = Item
myapp/views.py
from django.shortcuts import render, redirect from . import forms def index(request): """ModelFormSetを使うと一括データ編集のフォームを簡単に作れる """ formset = forms.ItemFormSet(request.POST or None) if formset.is_valid(): # BaseModelFormSetを継承している場合はsaveメソッドを呼んで保存できる formset.save() return redirect('index') return render(request, 'index.html', {'formset': formset})
感想
同じモデルのデータを一括編集する画面をこれぐらいのコードで作れるのはまあ便利だと思う。
完全なソースコードはbitbucketに置いた。
tokibito / sample_nullpobug / source / django / formsets_proj — Bitbucket