3

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

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

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

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

任何人都可以根据我需要的验证形式给我一个例子吗?

谢谢。

表格.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)
4

2 回答 2

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')
于 2013-05-23T16:31:46.940 回答
3

文档准确地解释了如何通过表单的方法验证相互依赖的表单clean()

于 2013-05-23T16:29:19.680 回答