如何在Django中验证Formsets?

时间:2018-01-27 03:49:27

标签: django python-3.x django-forms django-views django-1.11

我是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_valid是{{ 1}},我在这里犯了什么错误。

但如果我使用字段Trueformset,' validate_max'创建max_fields喜欢它显示消息。

min_fields

1 个答案:

答案 0 :(得分:0)

在我找到一些谷歌搜索后,默认情况下formsets不会验证其中的所有表单。所以我通过扩展CustomFormSet跟随

来创建BaseFormSet
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,因此验证工作正常。