2009-10-28 52 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 }}