如何在 Django 中验证表单集?

How To validate Formsets in Django?

我是 Django FormSet 的新手,假设我有如下表格。

class PillarForm(ModelForm):
    class Meta:
      model = Pillar
      exclude = ("created_at", "updated_at", "is_active", "owner")
PillarFormSet = formset_factory(PillarForm, validate_min=True)

我的支柱模型如下所示

class Pillar(models.Model):
  name = models.CharField(max_length=255)
  description = models.TextField(null=True)
  order = models.IntegerField()

  #SYSTEM FIELDS
  created_at = models.DateTimeField(auto_now_add=True)
  updated_at = models.DateTimeField(auto_now_add=True)
  is_active = models.BooleanField(default=True)
  report = models.ForeignKey(Report, on_delete=models.CASCADE)

当我的观点如下时

def pillars_create(request, report_id):
  context = {}
  report = Report.objects.get(pk=report_id, is_active=True)
  form = PillarFormSet()
  if request.POST:
    form = PillarFormSet(request.POST)
    print(form.errors)
  return render(request, os.path.join(TEMPLATE_FOLDER, "create/index.html"), 
  { 'report' : report, 'formset' : form })

但表单不显示错误消息,例如 nameorder 是必填字段,但不显示错误消息,form.is_validTrue, 我在这里犯了什么错误。

但是如果我用字段 max_fieldsmin_fields、'validate_max' 创建 formset,就像它显示消息一样。

PillarFormSet = formset_factory(PillarForm, max_num=5, min_num=4, validate_max=True, validate_min=True)

经过谷歌搜索后我发现,默认情况下 formsets 不会验证其中的所有表单。所以我通过扩展 BaseFormSet 创建 CustomFormSet 就像关注

class PillarRequiredFormSet(BaseFormSet):
    def __init__(self, *args, **kwargs):
       super(PillarRequiredFormSet, self).__init__(*args, **kwargs)
       for form in self.forms:
         form.empty_permitted = False

并将 customformset 作为 kwargs 传递,如下所示创建模型表单集。

PillarModelFormSet = modelformset_factory(Pillar, form=PillarForm, formset=PillarRequiredFormSet, extra=3)

并将 empty_permitted 设置为 false,这样验证工作正常。