欢迎访问宙启技术站
智能推送

Django.formsBaseFormSet():在表单集中自定义验证规则

发布时间:2024-01-04 16:56:27

Django.formsBaseFormSet()是一个基于表单的集合类,它可以用于自定义验证规则。本文将详细介绍如何自定义验证规则,并提供一个例子来说明如何使用BaseFormSet类。

要使用BaseFormSet类,首先需要导入它:

from django.forms import BaseFormSet

接下来,你可以定义自己的表单类并继承BaseFormSet类。在这个表单类中,你可以重写 clean() 方法来定义自定义的验证规则。

下面是一个例子,展示了如何使用BaseFormSet类来验证一个简单的表单集合:

from django import forms
from django.forms import BaseFormSet


class MyForm(forms.Form):
    name = forms.CharField(max_length=100)
    age = forms.IntegerField()
    email = forms.EmailField()


class MyFormSet(BaseFormSet):
    def clean(self):
        super().clean()

        names = []
        emails = []

        for form in self.forms:
            if 'name' in form.cleaned_data:
                name = form.cleaned_data['name']
                names.append(name)

            if 'email' in form.cleaned_data:
                email = form.cleaned_data['email']
                emails.append(email)

        if len(set(names)) != len(names):
            raise forms.ValidationError('Names must be unique')

        if len(set(emails)) != len(emails):
            raise forms.ValidationError('Emails must be unique')


formset = forms.formset_factory(MyForm, formset=MyFormSet)

在这个例子中,我们定义了一个名为MyForm的普通表单类作为基础表单,并定义了一个名为MyFormSet的表单集合类。在MyFormSet类中,我们重写了clean()方法来自定义验证规则。

在自定义的验证规则中,我们检查每个表单的nameemail字段。如果有重复的名称或邮箱,则会引发ValidationError异常。这些自定义的验证规则将在表单验证过程中自动调用。

最后,我们使用forms.formset_factory()函数创建一个表单集合。我们将MyForm作为基础表单,并指定formset参数为我们定义的MyFormSet类。

现在我们可以在视图中使用这个表单集合了。可以像处理普通表单一样处理它,包括验证和保存。

def my_view(request):
    if request.method == 'POST':
        formset = formset(request.POST)
        if formset.is_valid():
            # 处理验证通过的表单数据
            pass
    else:
        formset = formset()

    return render(request, 'my_template.html', {'formset': formset})

在这个视图中,我们首先检查请求方法是否是POST。如果是POST请求,我们将请求的POST数据传递给表单集合,并使用is_valid()方法来验证表单集合。

如果表单集合验证成功,通过调用cleaned_data属性可以获取验证通过的数据,并进行进一步处理。

如果请求方法不是POST,我们将创建一个空的表单集合,并将其传递给模板进行渲染。

希望这个例子能帮助你理解如何使用BaseFormSet类来自定义验证规则。通过使用这个类,你可以为表单集合定义自己的验证逻辑,并在表单集合中使用这些规则进行验证。