読者です 読者をやめる 読者になる 読者になる

Djangoでフォームセットを使って複数のレコードを一括編集する

Python Django

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})

実行結果

extraに1を指定しているので、既存のレコード数+1個の入力フォームが表示される。

感想

同じモデルのデータを一括編集する画面をこれぐらいのコードで作れるのはまあ便利だと思う。
完全なソースコードはbitbucketに置いた。
tokibito / sample_nullpobug / source / django / formsets_proj — Bitbucket