Djangoのフォームセットの使い方はよく忘れるので。
フォームセット (formsets) — Django v1.0 documentation
ドキュメントにフォームセットの項目はあるのでこのとおりでよい。
これだけだと面白くないので、AdminDateWidgetでも使ってみる。
Djangoのバージョンは1.2.1
urls.py
# coding:utf-8 from django.conf.urls.defaults import * from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', url(r'^$', 'myform.views.index'), url(r'^(?P<num>\d+)/$','myform.views.index'), url(r'^admin/', include(admin.site.urls)), url(r'^jsi18n/$', 'django.views.i18n.javascript_catalog', {'packages': 'django.conf'}, 'jsi18n') )
myform/views.py
# coding:utf-8 from datetime import date, timedelta from django.views.generic.simple import direct_to_template from myform.forms import MyFormSet def index(request, num=1): num = int(num) lst = [] for i in range(num): lst.append({ 'name': u'なまえ' + str(i), 'pub_date': date(2010, 8, 1) + timedelta(i), }) formset = MyFormSet(initial=lst) return direct_to_template(request, 'index.html', {'formset': formset})
新規入力-確認画面とかを考えたら、extraを指定したりする必要があるだろうからビューの中でformset_factoryを使うのがいいかもしれない。
myform/forms.py
# coding: utf-8 from django import forms from django.forms.formsets import formset_factory from django.contrib.admin.widgets import AdminDateWidget class MyForm(forms.Form): name = forms.CharField(label=u'名前') pub_date = forms.DateField(label=u'公開日', widget=AdminDateWidget) MyFormSet = formset_factory(MyForm, extra=0)
templates/index.html
{% load adminmedia %} <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/base.css" /> <link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/forms.css" /> <script type="text/javascript" src="{% admin_media_prefix %}js/core.js"></script> <script type="text/javascript" src="{% admin_media_prefix %}js/jquery.min.js"></script> <script type="text/javascript" src="{% admin_media_prefix %}js/jquery.init.js"></script> <script type="text/javascript" src="{% url jsi18n %}"></script> <script type="text/javascript">window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";</script> {{ formset.media }} </head> <body> <h1>フォームセットテスト</h1> <p> URLでフォームの数が変わります<br /><br /><br /> </p> <form action="" method="post"> {{ formset.management_form }} {% for form in formset.forms %} <div> {{ form }} </div> {% endfor %} <div> <input type="submit" /> </div> </form> </body> </html>
AdminDateWidgetで必要なjs/cssが結構あるのでちょっと面倒だけど、これで使えるのならまあありだと思う。