如何在 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 })
但表单不显示错误消息,例如 name
,order
是必填字段,但不显示错误消息,form.is_valid
是 True
, 我在这里犯了什么错误。
但是如果我用字段 max_fields
、min_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,这样验证工作正常。
我是 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 })
但表单不显示错误消息,例如 name
,order
是必填字段,但不显示错误消息,form.is_valid
是 True
, 我在这里犯了什么错误。
但是如果我用字段 max_fields
、min_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,这样验证工作正常。