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 现在可以使用了,因为它同时具有基本验证和自定义验证。