フォームセットで初期データの数を変えるついでにAdminDateWidgetを使う

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が結構あるのでちょっと面倒だけど、これで使えるのならまあありだと思う。