Django在两个字段中形成一个或另一个的自定义验证

时间:2013-05-23 16:21:19

标签: django django-forms

我正在努力解决以下问题并需要一些指导,下面你会看到我的form.py.我有两个名为groupsingle的字段。我需要对它们应用以下规则/验证......

  • 用户必须输入单个数字或至少选择一个组,但不能同时选择

因此,用户永远不能同时选择一个组并输入一个数字,但它们必须具有一个或另一个。希望有道理吗?

由于这些规则,我不能只添加required = true并需要某种自定义验证。这是自定义验证我遇到了问题。

根据我需要的那种验证形式,有人能给我一个例子吗?

感谢。

Forms.py

class myForm(forms.ModelForm):
    def __init__(self, user=None, *args, **kwargs):
        super(BatchForm, self).__init__(*args, **kwargs)
        if user is not None:
            form_choices = Group.objects.for_user(user).annotate(c=Count('contacts')).filter(c__gt=0)
        else:
            form_choices = Group.objects.all()
        self.fields['group'] = forms.ModelMultipleChoiceField(
            queryset=form_choices, required=False
        )
        self.fields['single'] = forms.CharField(required=False)

2 个答案:

答案 0 :(得分:8)

您需要在表单的clean方法中处理它。 像这样:

class BatchForm(forms.ModelForm):
    ...
    ...
    def clean(self):
        check = [self.cleaned_data['single'], self.cleaned_data['group']]
        if any(check) and not all(check):
            # possible add some errors
            return self.cleaned_data
        raise ValidationError('Select any one')

答案 1 :(得分:3)

documentation通过表单的clean()方法确切地解释了如何验证彼此依赖的表单。