【问题标题】:Django formset validating all formsDjango formset 验证所有表单
【发布时间】:2013-02-02 17:12:10
【问题描述】:

我已经做了一个这样的表单集。

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

问题是当我在视图中呈现此表单时,即使表单集中为空的表单也无法验证。报告“此字段为必填项”。在所有高度字段旁边。甚至是空的。

据我了解,空表单应始终通过验证。我查看了管理表单数据,一切正常。

如果我将 required 更改为 False,这意味着当我尝试将表单集保存到数据库时,我最终会遇到 IntegrityErrors。

【问题讨论】:

  • 另外有趣的是,如果我在高度字段中输入一个字母,而它需要一个正常验证的数字,空表单不会报告验证错误。

标签: django validation django-forms formset


【解决方案1】:

我终于弄清楚了它是什么,所以对于其他有这个问题的人来说,它很容易被忽视。

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

这一行:

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

使用了 growthFormChoice 变量,它是一个像这样的选择元组。

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

因此,默认值('0':'Select One') 导致将0 传递给每个未(有意)更改的表单并触发其余字段的验证。只需将其更改为 ('':'Select One') 即可。

【讨论】:

    猜你喜欢
    • 2011-02-01
    • 2011-01-27
    • 2023-04-06
    • 2019-04-15
    • 2018-08-08
    • 2018-08-29
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    相关资源
    最近更新 更多