如果我不想调用clean_ <fieldname>()方法,我可以这样做吗?</fieldname>

时间:2013-02-16 12:16:33

标签: django python-2.7 django-forms django-1.4 django-validation

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')

有时,我想使用表单验证,以便仅验证电子邮件&#39;字段。

如下所示:

>>> 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>

有路吗?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

您可以尝试以下方式:

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

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

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