django 1.4 を使用して、ModelFormSet に初期インスタンスがなく、extra と max が 6 に設定されています。
# forms.py
ChildFormSet = modelformset_factory(Child, formset=FirstRequiredModelFormSet, exclude=('family_application', 'exported', 'index',), extra=6, max_num=6)
child_queryset = Child.objects.none()
ユーザーが最初にページにアクセスしたときに、jquery を使用して 1 つの空白のフォーム (フィールドセット) のみを表示します。ユーザーはボタンを押して残りのフォームを表示できます。フォームが検証エラーで返された場合、jquery を使用してクラス errorlist を持つフィールドセットを検索し、それらすべてのフィールドセットを表示できます。ただし、有効なデータを含むフィールドセットも表示したいと考えています。各フィールドセットのすべての要素を検査して、値があるかどうかを確認できますが、それは扱いにくいようです。Django はフォームがいつ変更されたかを知っているので、それらのフォームにプレフィックスを追加して、html でそれらを見つけられるようにすると考えました。
class FirstRequiredModelFormSet(BaseModelFormSet):
def __init__(self, *args, **kwargs):
super(FirstRequiredModelFormSet, self).__init__(*args, **kwargs)
self.forms[0].empty_permitted = False
def clean(self):
super(FirstRequiredModelFormSet, self).clean()
for form in self.forms:
if form.has_changed():
form.prefix = '-'.join(('modified', form.prefix))
問題は、私が clean() をオーバーライドしている方法により、フォームがエラーで返されたときに送信されたデータが失われることです (初期データなしで返されます)。次のように、最初に検証エラーをチェックして早めに戻った場合:
def clean(self):
if any(self.errors):
return
super(FirstRequiredModelFormSet, self).clean()
for form in self.forms:
if form.has_changed():
form.prefix = '-'.join(('modified', form.prefix))
、データはまだそこにありますが、もちろんプレフィックスは追加されません。has_changed() の代わりに is_bound を使おうと思ったのですが、最初からすべてのフォームがバインドされているようです。
BaseModelFormSet.clean() をオーバーライドしてプレフィックスを追加すると、返されたフォームの初期データが失われる理由はありますか?