4

Django 1.4とフォームセットに関して、奇妙な問題が発生しています。送信されたデータが変更されていない場合、フォームセット自体が検証に合格したとしても、フォームセットのcleaned_dataフィールドは空です。

次に例を示します。

forms.py:

class NameForm(forms.Form):
    name = forms.CharField(required=False, initial='Foo')

views.py:

def welcome(request):

    Formset = formset_factory(NameForm, extra=1)
    if request.method == 'POST':
        formset = Formset(request.POST)
        print '1.Formset is valid?', formset.is_valid()
        print '2.Formset', formset
        print '3.Formset cleaned_data', formset.cleaned_data
    else:
        formset = Formset()
    return render_to_response('template.html', locals())

有効であり、実際formsetにはデータが含まれていますが、フィールドの初期値を実際に変更しない限り、3行目は空の辞書のリストを出力します。

これは私には奇妙に思えますが、おそらく何か間違ったことをしています。何か助けはありますか?

4

2 に答える 2

7

フォームセットは、フォームの最大数などの情報を保持するいくつかの非表示の入力フィールドだけでなく、フォームの束をレンダリングします。したがって、正しくPOSTされたフォームセットには常にデータが含まれます。

そして、CharField内の最初の「Foo」nameは、フォームセットが空の辞書を取得した理由です。フォームのがTrueにempty_permitted設定されていて、フォームのすべてのアイテムが初期値に等しい場合、Djangoはフォームを空として扱い、cleaned_dataを空のdictに設定します。デフォルトはempty_permittedFalseで、formsetは追加のフォームに対してTrueに設定します。したがって、値「Foo」を編集せずに送信をクリックした後、フォームインスタンスは空として扱われたため、フォームをラップするフォームセットは空のcleaned_dataを取得しました。

于 2012-03-31T16:28:19.853 に答える
0

これは私に起こりました。@okmは正しいですが、彼の回答からそれを修正する方法は明確ではありません。解決策については、次の回答を参照してください。

class MyModelFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super(MyModelFormSet, self).__init__(*args, **kwargs)
        for form in self.forms:
            form.empty_permitted = False
于 2013-12-17T23:03:06.210 に答える