0

Django:如果我不想调用 clean_() 方法,我可以这样做吗?

class myForm(forms.Form):
    userId = forms.CharField(max_length=30, required=False,)
    email = forms.EmailField(required=False,)

    def clean_userId(self):
        if 'userId' in self.cleaned_data:
            if not re.search(r'^\w+$', self.cleaned_data['userId']):
                raise forms.ValidationError('Invalid ID')
            try:
                User.objects.get(username=self.cleaned_data['userId'])
            except ObjectDoesNotExist:
                return self.cleaned_data['userId']
            raise raise forms.ValidationError('Invalid ID')
        else:
            raise raise forms.ValidationError('Invalid ID')

有时,我想使用表单验证来仅验证“电子邮件”字段。

如下所示:

>>> form = myForm({'email':'abc@com'})
>>> form.cleaned_data['email']
Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'myForm' object has no attribute 'cleaned_data'
>>> print form.errors
<ul class="errorlist"><li>workers<ul class="errorlist"><li>Invalid ID</li></ul>

有办法吗?

4

2 回答 2

0

您可以尝试以下方法:

form = myForm({'email':'abc@com'})
try:
    form.clean_email()
except forms.ValidationError:
    #do whatever
else:
    #do whatever

is_valid()将调用clean所有内容,因此只需调用clean您想要的任何方法。

您也可以只有两种不同的形式或从另一个继承的形式,这将是更好的 IMO。

于 2013-02-16T15:26:26.757 回答
0

您不需要定义,clean_userId()或者clean_email(),只需定义clean(),在 Form 的那个方法中做所有事情。

class MyForm(forms.Form):
    # fields

    def clean(self):
        cleaned_data = super(MyForm, self).clean()
        email = cleaned_data.get('email')

        # do some validation

        return cleaned_data

在访问之前cleaned_data,记得打电话form.is_valid()

于 2013-02-16T12:25:43.100 回答