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>