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>
有路吗?
答案 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。