2009-10-28 9 views
5

djangoフォームセットのすべてのフォームを作成するにはどうすればいいですか? cleaned_dataのすべてのフィールドの存在を検証しようとしましたが、formsetのclean()メソッドをオーバーライドしましたが、エラーが表示されずに自動的に失敗します。Djangoフォームセットが必要です

ありがとうございます!

ソースコード:

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になりましたが、エラーは表示されませんでした。

+0

あなたはより多くの詳細とソースコードをお願いできますか? formset.is_valid()はfalseですが、 – luc

答えて

0

ここではエラーが表示されていません。

is_validがFalseの場合は、有効であり、それが自己検証であることを示します。次に見えるのは、テンプレート層です。どのようにエラーをチェックしていますか? {{form.errors}}か{{somefield.errors}}です。

ここでクリーンメソッドを設定する方法は、エラーはどのフィールドにも関連付けられませんが、すべてのエラースロットに入る必要があります。

乾杯

+0

formset.errorsは空です。私のバグのように見えます。 –

0

私はこの同じ問題を抱えていたし、これらのエラーは、ソースをチェックして、保存した場所を考え出しました。フォームセットのクリーンメソッドをオーバーライドし、検証エラーを発生させると、エラーはnon_form_errorsプロパティに格納されます。

だからあなたのテンプレートであなたがフォームセットのためのテンプレート変数が「フォームセット」という名前と仮定すると、次を追加する必要があります。

{{ formset.non_form_errors }} 
関連する問題