Django raise forms.ValidationError不工作

Django raise forms.ValidationError不工作,django,validation,django-forms,inline-formset,Django,Validation,Django Forms,Inline Formset,我有以下型号: class Project(models.Model): title = models.CharField(max_length="100") pub_date = models.DateField(auto_now_add=True, editable=False) budget = models.IntegerField() class Milestone(models.Model): title = models.CharField(

我有以下型号:

class Project(models.Model):
    title = models.CharField(max_length="100")

    pub_date = models.DateField(auto_now_add=True, editable=False)

    budget = models.IntegerField()

class Milestone(models.Model):

    title = models.CharField(max_length="50")

    budget_percentage = models.IntegerField(max_length=2)

    project = models.ForeignKey(Project)
在项目的创建表单中,我包含了里程碑的内联表单集

我想验证一下,当一个项目被提交时,至少会创建4个里程碑,并且所有里程碑的预算百分比总计为100%

这是我的表格:

class BaseMilestoneProjectFormSet(BaseFormSet):
    def clean(self):

        if any(self.errors):
            # Don't bother validating the forms unless each form is valid on its own
            return

        if len(self.forms) < REQUIRED_MILESTONES:
            raise forms.ValidationError("At least %s milestones need to be created" % REQUIRED_MILESTONES)

        # Set initial control variables
        # Total percentage of budget to control
        total_percentage = 0
        # Date to control that milestones are linear, i.e. that second milestone isn't delivered before first
        current_control_date = date.min

        for i, form in zip(range(len(self.forms)), self.forms):

            if i == 0 and form.budget_percentage > MAX_BUDGET_FIRST_MILESTONE:
                raise forms.ValidationError("First milestone budget must not exceed %s percentage" % MAX_BUDGET_FIRST_MILESTONE)
            elif form.budget_percentage > MAX_BUDGET_MILESTONE:
                raise forms.ValidationError("Milestone's budget must not exceed %s percentage" % MAX_BUDGET_MILESTONE)

            if form.estimated_delivery_date < current_control_date:
                raise forms.ValidationError("Milestones must be linear, check your delivery dates")

            # Set control variables for next iteration    
            current_control_date = form.estimated_delivery_date                
            total_percentage += form.budget_percentage

        if total_percentage != 100:
            raise forms.ValidationError("All milestones budget percentage should sum up to 100%")

如果我理解你的问题,问题是你在计算表单集中有多少个表单,但是你想/需要计算表单集中有多少个表单

所以,我认为你需要改变这一行:

if len(self.forms) < REQUIRED_MILESTONES:
if len(self.forms)
对于这些线路:

bounded_forms = filter(lambda form:form.isbound(), self.forms)
if len(bounded_forms) < REQUIRED_MILESTONES:
bounded_forms=filter(lambda表单:form.isbound(),self.forms)
如果len(有界形式)<要求的里程碑:
然后,您可以在执行验证时引发验证错误

编辑:

也许您不了解表单集验证是如何工作的。可能会有帮助,特别是这句话:

调用所有Form.clean方法后,将调用formset clean方法。将使用表单集上的non_form_errors()方法查找错误

如果我明白你说的意思

当我提交包含3个空里程碑表单的表单时,它对第一个表单没有任何作用。ValidationError(…)

然后,您没有看到所引发的错误。因此,寻找它们的地方是formset“non_form_errors”方法。在模板中放入类似的内容:

<span>{{milestone_formset.non_form_errors}}</span>
{{milestone\u formset.non\u form\u errors}
现在,您应该看到您在milestone formset clean方法中提出的错误


希望有帮助

检查表单集是否有效时会发生什么情况?formset.is_valid()它应该返回false。您实际上是如何使用表单的?请给我们一些有关如何使用表单集的线索。如果可以,请添加使用表单集的视图的代码。尝试更改的
len(self.forms)
部分。当你说“当我提交没有3个空里程碑表格的表格时”,你的意思是“当我提交有3个空里程碑表格的表格时”,这可能会对你有所帮助吗?是“带”还是“不带”?@mtnpaul我要尝试一下,我不认为这是问题所在,我已经测试了它是否使用raise EXECOPTION(消息)进入if,并且它正确引发了异常。问题在于forms.valueError我正在表单模板上使用非表单错误。问题是django的行为就像没有什么问题一样,重定向到成功页面,而不是返回表单模板
<span>{{milestone_formset.non_form_errors}}</span>