2009-10-28 55 views
5

如何使django formset中的所有表單都被要求?我試圖驗證cleaned_data覆蓋formset的clean()方法中所有字段的存在,但它只是在沒有任何錯誤顯示的情況下以靜默方式失敗。需要Django formsets

謝謝!

的源代碼:

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) 

有各7點的形式爲一天,所有的人都必須填寫有效。在上面的例子中,我只是試圖提出乾淨的錯誤。 is_valid()變成了False,但沒有顯示錯誤。

+0

能否請您提供更多的細節和源代碼? – luc 2009-10-28 12:24:48

回答

0

這有點難理解其中錯誤沒有被顯示。

如果is_valid是False,那麼很好,它自我驗證工作。然後下一個地方是模板層。你如何檢查錯誤? {{form.errors}}或{{somefield.errors}}。

清潔方法在這裏設置的方式,它們的錯誤不會與任何字段關聯,但應該在所有 erros插槽中。

乾杯

+0

儘管formset.is_valid()爲false,但formset.errors爲空。看起來像是一個bug。 – 2009-10-28 13:56:15

0

我有這個同樣的問題,想出了在那裏這些錯誤被檢查源存儲。當您重寫formset的clean方法並引發驗證錯誤時,錯誤將存儲在non_form_errors屬性中。

所以在你的模板,你將需要添加以下承擔表單集模板變量命名爲「表單集」:

{{ formset.non_form_errors }}