Django - 将表单验证添加到 inlineformset_factory
Django - Add form validation to inlineformset_factory
所以,我正在尝试验证 inlineformset_factory 对象中的某些字段,但我看不到如何从这个视图中以干净的方式执行此操作(不使用表单 class).
在这种情况下是否可以覆盖 .is_valid() 方法?
如有任何帮助,我们将不胜感激。
def tenant(request, id):
tenant = Tenant.objects.get(id=id)
DealerFormset = inlineformset_factory(Tenant, Dealer, fields=('name', 'phone_number'), extra=0)
formset = DealerFormset(instance=tenant)
if request.method == 'POST':
formset = DealerFormset(request.POST, instance=tenant)
if formset.is_valid(): # <--- How to add custom validations here?
formset.save()
return redirect('tenant_details', id=tenant.id)
context = {
'formset': formset,
}
return render(request, 'tenant_details.html', context)
您基本上需要根据 BaseInlineFormSet
class 创建自己的表单集。您可以查看 django 文档 here 以获取更多信息,但其实并没有什么复杂的。
然后您可以通过添加要用作参数的表单集来创建表单集:
formset_factory(TestForm, formset=BaseTestFormSet)
由于您使用 inlineformset_factory
创建集合,我建议使用子classing BaseInlineFormSet
并实施 clean
方法。一旦你有了自定义 FormSet
class,你可以通过 formset
关键字参数将其传递给 inlineformset_factory
。以下应适用于您当前的设计:
from django.forms import (
BaseInlineFormSet, inlineformset_factory
)
# Make a custom FormSet class and implement the clean method
# to customize the validation
class CustomInlineFormSet(BaseInlineFormSet):
def clean():
# Implement your custom validation here
# Use your custom FormSet class as an argument to inlineformset_factory
DealerFormset = inlineformset_factory(
Tenant, Dealer, fields=('name', 'phone_number'),
extra=0, formset=CustomInlineFormSet
)
DealerFormset
现在可以使用了,因为它同时具有基本验证和自定义验证。
所以,我正在尝试验证 inlineformset_factory 对象中的某些字段,但我看不到如何从这个视图中以干净的方式执行此操作(不使用表单 class).
在这种情况下是否可以覆盖 .is_valid() 方法?
如有任何帮助,我们将不胜感激。
def tenant(request, id):
tenant = Tenant.objects.get(id=id)
DealerFormset = inlineformset_factory(Tenant, Dealer, fields=('name', 'phone_number'), extra=0)
formset = DealerFormset(instance=tenant)
if request.method == 'POST':
formset = DealerFormset(request.POST, instance=tenant)
if formset.is_valid(): # <--- How to add custom validations here?
formset.save()
return redirect('tenant_details', id=tenant.id)
context = {
'formset': formset,
}
return render(request, 'tenant_details.html', context)
您基本上需要根据 BaseInlineFormSet
class 创建自己的表单集。您可以查看 django 文档 here 以获取更多信息,但其实并没有什么复杂的。
然后您可以通过添加要用作参数的表单集来创建表单集:
formset_factory(TestForm, formset=BaseTestFormSet)
由于您使用 inlineformset_factory
创建集合,我建议使用子classing BaseInlineFormSet
并实施 clean
方法。一旦你有了自定义 FormSet
class,你可以通过 formset
关键字参数将其传递给 inlineformset_factory
。以下应适用于您当前的设计:
from django.forms import (
BaseInlineFormSet, inlineformset_factory
)
# Make a custom FormSet class and implement the clean method
# to customize the validation
class CustomInlineFormSet(BaseInlineFormSet):
def clean():
# Implement your custom validation here
# Use your custom FormSet class as an argument to inlineformset_factory
DealerFormset = inlineformset_factory(
Tenant, Dealer, fields=('name', 'phone_number'),
extra=0, formset=CustomInlineFormSet
)
DealerFormset
现在可以使用了,因为它同时具有基本验证和自定义验证。