11

フォームセットに少し問題があります。

ページに複数のフォームセットを表示する必要があり、各フォームセットには複数のフォームがあります。だから私はそのようなことをしました:

#GET
for prod in products:
     ProductFormSet = modelformset_factory(Product,exclude=('date',),extra=prod.amount)
     formsset.append(ProductFormSet(prefix="prod_%d"%prod.pk))

#POST
for prod in products:
     ProductFormSet = modelformset_factory(Product,exclude=('date',),extra=prod.amount)
     formsset.append(ProductFormSet(request.POST,prefix="prod_%d"%prod.pk))

問題は、ページを送信すると、空のフォームが「自動的に」(チェックなしで) 有効になることですが、1 つのフォームの 1 つのフィールドに入力すると、チェックが機能します。

よくわからないので、わかる方いましたら、

ありがとう。

4

4 に答える 4

23

別の問題を調査しているときに、この質問に遭遇しました。私の問題の解決策を探して Django ソースを掘り下げているときに、この質問に対する答えを見つけたので、ここに文書化します。

フォームが空の値を持つことが許可され (これは、フォームセット内に含まれる空のフォームに適用されます) 送信された値が最初の値から変更されていない場合、検証はスキップされます。django/forms/forms.py の full_clean() メソッドを確認します (Django 1.2 の 265 行目):

# If the form is permitted to be empty, and none of the form data has
# changed from the initial data, short circuit any validation.
if self.empty_permitted and not self.has_changed():
     return

あなたが探している解決策の種類はわかりません(また、この質問はすでにやや時代遅れです)が、これは将来誰かを助けるかもしれません.

于 2011-03-22T20:54:39.790 に答える
16

@ジョナス、ありがとう。あなたの説明を使用して問題を解決しました。空のときに検証しないフォームが必要でした。(javascriptで追加されたフォーム)

class FacilityForm(forms.ModelForm):
    class Meta:
        model = Facility

    def __init__(self, *arg, **kwarg):
        super(FacilityForm, self).__init__(*arg, **kwarg)
        self.empty_permitted = False


 facility_formset = modelformset_factory(Facility, form=FacilityForm)(request.POST)

送信時に表示されるフォームが空であってはならないことを確認します。

于 2013-01-21T16:50:36.920 に答える
2

「formset_factory」の「extra」パラメーターに基づいて作成されたフォームには、「empty_permitted」プロパティが True に設定されています。(参照: formset.py 123行目)

# Allow extra forms to be empty.
    if i >= self.initial_form_count():
        defaults['empty_permitted'] = True

したがって、このユースケースでは、「formset_factory」の「追加」パラメーターではなく、FormSet の「初期」パラメーターを使用する方が良い方法のようです。

using-initial-data-with-a-formset で説明を見つけてください

于 2012-04-06T06:33:48.670 に答える