2011-10-30 158 views
29

我有一个非常简单的形式:自定义表单验证

from django import forms 

class InitialSignupForm(forms.Form): 
    email = forms.EmailField() 
    password = forms.CharField(max_length=255, widget = forms.PasswordInput) 
    password_repeat = forms.CharField(max_length=255, widget = forms.PasswordInput) 

    def clean_message(self): 
     email = self.clean_data.get('email', '') 
     password = self.clean_data.get('password', '') 
     password_repeat = self.clean_data.get('password_repeat', '') 

     try: 
      User.objects.get(email_address = email) 
      raise forms.ValidationError("Email taken.") 
     except User.DoesNotExist: 
      pass 

     if password != password_repeat: 
      raise forms.ValidationError("The passwords don't match.") 

请问这是怎么自定义窗体验证呢?我需要评估email目前没有用户使用该电子邮件地址。我还需要评估passwordpassword_repeat的匹配。我怎么能这样做呢?

+0

我宁愿就mothel而不是形式的检验:http://beutil.blogspot.com/2011/10/django-moving- business-rules-from-views.html – danihp

回答

83

要验证它自己的一个字段,你可以在你的形式使用clean_FIELDNAME()方法,因此对于电子邮件:

def clean_email(self): 
    email = self.cleaned_data['email'] 
    if User.objects.filter(email=email).exists(): 
     raise ValidationError("Email already exists") 
    return email 

则依赖于彼此相互依存的字段,可以覆盖形式这是所有字段后运行(如上面emailclean()方法进行了验证个别:

def clean(self): 
    form_data = self.cleaned_data 
    if form_data['password'] != form_data['password_repeat']: 
     self._errors["password"] = ["Password do not match"] # Will raise a error message 
     del form_data['password'] 
    return form_data 

我不知道你在哪里得到了clean_message(),但看起来是做了一个验证方法一个 message字段似乎不存在于您的表单中。

有通过此了解更多详情阅读:

https://docs.djangoproject.com/en/dev/ref/forms/validation/

+4

只是一个小的通知......'form_data ['password']!= form_data ['password']'可能应该有'password2'这样的密码重复字段。 – andi

+0

雅..应该是:form_data ['password']!= form_data ['password_repeat'] – pavanw3b

+0

我已经更改为'password_repeat',谢谢! –