我对模型表单formset的formset验证有一些奇怪的行为 . 我正在使用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()

Formset类生成:

WorkDoneFormSet = formset_factory(WorkDoneForm, can_delete=True)

在get_context_data视图函数中创建表单集:

context["work_done_formset"] = context.get("work_done_formset", WorkDoneFormSet(prefix='work_done'))

因此,我在formset中提交带有一个WorkDone表单的表单,没有任何输入的数据(当然是对于typeOfWork),这里来自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字段没有错误?谢谢 .