Django表单集验证异常行为

Django表单集验证异常行为,django,django-forms,django-validation,Django,Django Forms,Django Validation,我在模型表单集的表单集验证中遇到了一些奇怪的行为。 我正在使用Django 1.5和python 2.7 这是我使用的代码 模型类: class WorkDone(models.Model): task = models.ForeignKey(Task) type_of_work = models.ForeignKey("pricelist.TypeOfWork") 表格类别: class WorkDoneForm(forms.ModelForm): class Me

我在模型表单集的表单集验证中遇到了一些奇怪的行为。 我正在使用Django 1.5和python 2.7 这是我使用的代码

模型类:

class WorkDone(models.Model):
    task = models.ForeignKey(Task)
    type_of_work = models.ForeignKey("pricelist.TypeOfWork")
表格类别:

class WorkDoneForm(forms.ModelForm):

    class Meta:
        model = WorkDone
        exclude = ("task",)

    def __init__(self, *args, **kwargs):
        super(WorkDoneForm, self).__init__(*args, **kwargs)
        self.fields["type_of_work"].widget = forms.HiddenInput()
表单集类生成:

WorkDoneFormSet = formset_factory(WorkDoneForm, can_delete=True)
在视图的get_context_data函数中创建表单集:

context["work_done_formset"] = context.get("work_done_formset", WorkDoneFormSet(prefix='work_done'))
所以,我提交的表单中有一个WorkOne表单,表单集中没有任何输入的数据(当然是工作类型),这里是POST请求中的POST数据:

QueryDict: {u'_save': [u''],  
    u'work_done-0-type_of_work': [u''],  
    u'work_done-INITIAL_FORMS': [u'0'], 
    u'work_done-TOTAL_FORMS': [u'1'], 
    u'csrfmiddlewaretoken': [u'nFkTCyx3413yrFE9XpNQDGdNlzPAHwyI'], 
    u'work_done-MAX_NUM_FORMS': [u'1000']}
并在视图中显示此代码的输出:

work_done_formset = WorkDoneFormSet(request.POST, prefix="work_done")
print work_done_formset.is_valid(), work_done_formset.cleaned_data
for form in work_done_formset:
    print form.is_valid(), form.cleaned_data

>> True [{}]
>> True {}

为什么验证是正确的,为什么表单中缺少TypeOfWork字段没有错误?谢谢。

这是因为表单集中没有任何更改。每个表单的验证只有在表单集合的各个表单中发生更改时才会触发。所以,我需要为验证触发器的表单字段设置默认值?或者,也许,初始表单计数>0?好的。即使这样也不行,因为django formset有一个名为
formset.has_change()
的属性,它不会改变。如果你只有一张表格,为什么不只用一张表格呢。。您可以做的一件事是,重写的
def clean
方法,并确保至少填写了一个表单。还有一种选择: