2013-02-18 54 views
1

我做了一个这样的formset。Django formset验证所有表格

class MixedObsCollsForm(forms.Form): 

    def __init__(self, *args, **kwargs): 
     project_id = kwargs.pop('project_id') 
     super(MixedObsCollsForm, self).__init__(*args, **kwargs) 
     project = get_object_or_404(Project, pk=project_id) 
     self.fields['photos_upload'] = forms.ImageField(label="Photos", required=False) 

    taxon = forms.CharField(max_length=80, required=False) 
    growth_form = forms.ChoiceField(choices = growthFormChoice, required=False) 
    height = forms.DecimalField(max_value=99, min_value=0, decimal_places=2, required=True) 
    density = forms.IntegerField(max_value=100, min_value=1, required=False) 

我有一个奇怪的方式来显示它在视图中使用类来处理所有的处理。但它像这样...

class ObservationFormView(object):  

    def __init__(self, request=None, project_id=None, observation_id=None): 

     self.request = request 
     self.ObservationFormSet = formset_factory(form=MixedObsCollsForm, extra=5) 
     self.ObservationFormSet.form = staticmethod(curry(MixedObsCollsForm, project_id=project_id)) 
     self.project = get_object_or_404(Project, pk=project_id) 



     self.user = request.user 

     self.use_type = 'create' 
     self.formset = self.ObservationFormSet(self.request.POST or None) 


    def isValid(self): 
     return self.formset.is_valid() & self.locationForm.is_valid() 

    def render(self): 
     return render(self.request, 'observation_form.html', {'use_type': self.use_type, 'formset': self.formset, 'locationForm':self.locationForm, 'project_photos': self.project.photos.all(),}) 

    def processForm(self):  

     for form in self.formset: 
      if form.is_valid() == True: 
       if form.cleaned_data['is_collection'] == True: 
        collection = self.getOrMakeCollection(form.cleaned_data, self.locationForm.cleaned_data['location'], False) 
       if form.cleaned_data['is_collection'] == False: 
        collection = self.getOrMakeCollection(form.cleaned_data, self.locationForm.cleaned_data['location'], True) 

       observation = self.saveObservation(form.cleaned_data, self.locationForm.cleaned_data['location'], collection) 


     return observation 

问题是,当我在一个视图中,即使该formset这是空不验证中的表单显示这个表单。报告“这个字段是必需的。”旁边的所有高度领域。即使是空的。

这是我的理解,空的形式应该总是通过验证。我查看了管理表格数据,看起来一切正常。

如果我需要更改为False,这意味着当我尝试将formset保存到数据库时,最终会收到IntegrityErrors。

+0

另外有趣的是,如果我在高度字段中输入一个字母,当它期待一个数字时,它会正常验证,空的表单不会报告验证错误。 – 2013-02-18 09:53:49

回答

1

我终于弄清楚它是什么,所以在这里它是对任何有这个问题的人来说,它容易忽视。

它甚至没有包含在问题的代码中,所以没有太多的人可以提供帮助。

这条线:

growth_form = forms.ChoiceField(choices = growthFormChoice, required=False) 

使用的growthFormChoice变量这是像这样选择的元组。

growthFormChoice = (('0', 'Select one'), 
        ('T', 'tree'), 
        ('S', 'shrub')) 

由于此默认值('0':'Select One')的导致传递到0改变每形式,其不是(有意地)和触发验证的其余字段。只需将其更改为('':'Select One')即可。