0

私が持っているビューの1つは、カスタムフィールドクリーニングを使用したモデルフォームを使用することです。クリーニングの1つのタイプは、ユーザーがすでに値に設定されているフィールドに変更を送信しようとしているかどうかをチェックすることです。これは、ValidationErrorをスローすることで、希望どおりに機能します。もちろん問題は、一度に1つのフォームしか送信できないことです。そのため、modelformsetを使用して複数のフォームを送信したいと思います。

modelformsetのcleanメソッドをオーバーライドできることは知っていますが、modelformsetでmodelformのフィールドクリーニングメソッドを使用できるかどうかを尋ねています。。現在、空のフィールドを使用してmodelformsetを送信すると、is_valid()が渡されますが、これは私には奇妙に思えます...

また、カスタムモデルフォームセット検証コードがどこに「一般的に」行くのか知りたいですか?私はforms.pyで考えていました。

*編集-答え付き。私のhttpResponseRedirectでは、検証なしでフォームを送信できました。

def mass_check_in(request):
    # queryset
    qs = Part.objects.none()
    errlst=[]
    c = {}
    c.update(csrf(request))

    # Creating a model_formset out of PartForm
    PartFormSetFactory = modelformset_factory(model=Part,
                                              form=PartForm,
                                              formset=BasePartFormSet, 
                                              extra=2)
    if request.method == 'POST':
        PartFormSet = PartFormSetFactory(request.POST)
        if PartFormSet.is_valid():
            PartFormSet.save()
            return http.HttpResponseRedirect('/current_count/')

    else:        
        PartFormSet = PartFormSetFactory(queryset=qs, initial=[
                                                               {'serial_number':'placeholder',
                                                                },
                                                               {'serial_number':'placeholder'
                                                                }])

    return render(request,'mass_check_in.html',{
                                           'title':'Add Item',
                                           'formset': PartFormSet,
                                           'formset_errors': PartFormSet.non_form_errors(),
                                           })
4

1 に答える 1

4

モデルフォームセットのモデルフォームの1つにデータをまったく入力しない場合、そのフォームの検証はスキップされます。ドキュメントから

フォームセットは、変更されていない余分なフォームを無視するのに十分スマートです。

empty_permitted=Falseフォームを強制することで、この機能を実際に無効にすることができます。詳細については、この質問に対する受け入れられた回答を参照してください:Djangoフォームセット:最初に必須にしますか?

フォームセットには独自のcleanメソッドがありますが、これはフォームセット内の2つ以上のフォーム間の情報を検証するために使用され、個々のフォーム自体を検証するためではありません(formscleanメソッドで処理する必要があります-現在行っているように)。

フォームセットには、Formクラスのメソッドと同様のクリーンなメソッドがあります。ここで、フォームセットレベルで機能する独自の検証を定義します。

別の同様の質問があります:

Djangoフォームセットは検証されません

于 2012-08-17T01:02:19.613 に答える