0

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() をオーバーライドしてプレフィックスを追加すると、返されたフォームの初期データが失われる理由はありますか?

4

1 に答える 1

0

ブラウザがフォームをサーバーにポストバックすると、Django はプレフィックスを使用して、どのフォームがどの Child オブジェクトに属しているかを識別します。独自のプレフィックスを追加して、そのシステムを台無しにしていると思います。

変更されたフォームを識別するために別のシステムを使用することをお勧めします。テンプレートでメソッドを使用できるはずだと思うhas_changed()ので、次のようなことができます-

<form class="{% if form.has_changed %}changed{% endif %}">

(テンプレートでメソッドを呼び出すときは括弧がないことに注意してください)。

于 2013-02-16T21:23:16.530 に答える