1

私はかなり大きなフォームを持っていますが、これには 2 つの可能性があります。これはイベントのフォームであり、イベントの場所はコンボボックス (ModelChoice クエリ) から選択できます。ただし、ユーザーが [新しい場所] チェックボックスをオンにすると、新しい場所を挿入するために必要なフィールドがフォームに表示され、[既存の場所] コンボボックスがリセットされる可能性があります。さて、これはすべてjavascript(jQuery)で非常にうまく機能しますが、私の問題はフォーム内の未使用のフィールドを検証する方法です.

簡単に言うと> 7 つのフォーム フィールドがあり、そのうち 3 つは常に必須 (イベント タイプ、日時など) で、もう 1 つはチェックボックス「新しい場所」の状態に依存します: new_location がチェックされている場合> 場所を検証するなどフィールドを無視し、残りを無視します (空にすることができます)。それ以外の場合は、場所フィールドを無視し、残りを検証します。

class EventForm(ModelForm):

    area = forms.ModelChoiceField(
        queryset=Area.objects.order_by('name').all(),
        empty_label=u"Please pick an area",
        label=u'Area',
        error_messages={'required':u'The area is mandatory!'})

    type = forms.ModelChoiceField(
        queryset=SportType.objects.all(),
        empty_label=None,
        error_messages={'required':'Please pick a sport type!'},
        label=u"Sport")

    #shown only if new_location is unchecked - jQuery
    location = forms.ModelChoiceField(
        queryset=Location.objects.order_by('area').all(),
        empty_label=u"Pick a location",
        error_messages={'required':'Please pick a location'},
        label=u'Location')

    #trigger jQuery - hide/show new location field
    new_location = forms.BooleanField(
        required=False,
        label = u'Insert new location?'
            )

    address = forms.CharField(
        label=u'Locatio address',
        widget=forms.TextInput(attrs={'size':'30'}),
        error_messages={'required': 'The address is required'})

    location_description = forms.CharField(
        label=u'Brief location description',
        widget=forms.Textarea(attrs={'size':'10'}),
        error_messages={'required': 'Location description is mandatory'})

    class Meta:
        model = Event
        fields = (
            'type',
            'new_location',
            'area',
            'location',
            'address',
            'location_description',
            'description',
        )
4

2 に答える 2

3

メソッド内にフォーム フィールドが存在することを確認できますclean。存在する場合は、カスタム検証ルールを実行します。

def clean(self):
    cleaned_data = self.cleaned_data
    field_name = cleaned_data.get('FIELD_NAME', None)

    if field_name:
    ... # do stuff
    return cleaned_data
于 2012-05-15T16:50:39.120 に答える
0

チェックボックスの状態に応じて、通常のフォーム(ModelFormではない)とカスタム検証のみをclean(self)使用することになりました。これが正しい方法だと思います。その後self._errors["address"]=ErrorList([u'Some custom error'])、検証プロセス中に発生する可能性のあるさまざまなエラーを完全にカスタマイズすることができました.

于 2012-05-18T07:37:37.897 に答える