5

djangoフォームセットのすべてのフォームを必須にする方法は? formset の clean() メソッドをオーバーライドしてすべてのフィールドの存在を検証しようとしましたcleaned_dataが、エラーが表示されることなくサイレントに失敗します。

ありがとう!

ソースコード:

class BaseScheduleForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(BaseScheduleForm, self).__init__(*args, **kwargs)
        self.fields['day'].widget = forms.HiddenInput()
        self.fields['user'].widget = forms.HiddenInput()

    class Meta:
        model = Schedule

    def clean_end_time(self):
        start_time = self.cleaned_data.get('start_time')
        end_time = self.cleaned_data['end_time']

        if start_time and end_time:
            if end_time <= start_time:
                raise forms.ValidationError("End time must be later that start time.")
        return end_time

class BaseScheduleFormset(forms.models.BaseModelFormSet):

    def __init__(self, *args, **kwargs):
        super(BaseScheduleFormset, self).__init__(*args, **kwargs)
        for number, weekday in enumerate(WEEKDAYS):
            self.forms[number].day_name = weekday[1]

    def clean(self):
        raise forms.ValidationError('You must specify schedule for the whole week')

ScheduleFormset = forms.models.modelformset_factory(Schedule, extra=7, max_num=7,
    form=BaseScheduleForm, formset=BaseScheduleFormset)

フォームは 1 日 7 枚あり、すべてのフォームに記入する必要があります。上記の例では、クリーンでエラーを発生させようとしました。is_valid()False になりましたが、エラーは表示されませんでした。

4

2 に答える 2

0

エラーが表示されていない場所を理解するのは少し難しいです。

is_valid が False の場合は、検証自体が機能しています。次に、テンプレート レイヤーを確認します。どのようにエラーをチェックしていますか? {{form.errors}} または {{somefield.errors}}。

ここでの clean メソッドのセットアップ方法では、エラーはどのフィールドにも関連付けられませんが、all erros スロットに入る必要があります。

乾杯

于 2009-10-28T13:16:24.177 に答える
0

これと同じ問題があり、ソースを確認してこれらのエラーが保存されている場所を見つけました。フォームセットの clean メソッドをオーバーライドして検証エラーを発生させると、エラーは non_form_errors プロパティに格納されます。

したがって、フォームセットのテンプレート変数の名前が「formset」であると仮定して、テンプレートに次を追加する必要があります。

{{ formset.non_form_errors }}
于 2010-07-01T14:48:15.380 に答える