2009-12-09 2 views
7

양식 유효성 검사를 시도하고 있습니다 (이전에는 작동 했었습니다). 어떤 이유로 인해 form.is_valid()가 호출 될 때 clean_username (self)와 같은 다양한 클리닝 함수를 호출 할 수없는 것처럼 보입니다. 나는 거의 충분한 검사가없는 것을 알고Django 폼이 정상적으로 호출되지 않습니다. <fieldname>

아직 (그들은 당신이 ;-) 볼 공사중),하지만 여기 내 클래스입니다 :

class LoginForm(forms.Form): 
    username = forms.CharField(max_length=30) 
    password = forms.CharField(max_length=30,widget=forms.PasswordInput) 

    def clean_password(self): 
     print "Cleaning password" 
     password = self.cleaned_data['password'] 
     if password == u"": 
      raise forms.ValidationError("Password is blank.") 
     return password 

    def clean_username(self): 
     username = self.cleaned_data['username'] 
     if len(username) < 4: 
      raise forms.ValidationError("Username is fewer than four charecters.") 
     return username 


class RegistrationForm(LoginForm): 
     confirm_password = forms.CharField(widget=forms.PasswordInput, max_length=30) 
     email = forms.EmailField() 

     def clean_confirm_password(self): 
      print "Cleaning confirm password" 
      clean_confirm_password = self.cleaned_data['confirm_password'] 
      if clean_confirm_password == u"": 
       raise forms.ValidationError("Confirming password is blank.") 
      return clean_confirm_password 

     def clean(self): 
      print "Running clean on a registration form" 
      print self.cleaned_data.items() 
      password = self.cleaned_data['password'] 
      confirm = self.cleaned_data['confirm_password'] 
      if password != confirm: 
       raise forms.ValidationError('Passwords do not match.') 
      return self.cleaned_data 

감사합니다!

답변

25

Django forms.py 소스로 다이빙 한 후 오류의 원인을 발견했습니다.

필드가 비어있는 경우 폼은 field.clean()을 호출 한 후 해당 필드에 대해 ValidationError를 발생 시키지만 clean_<fieldname>은 호출하지 않지만 여전히 클래스의 기본 정리 메서드를 호출합니다.

def clean(self): 
    try: 
     password = self.cleaned_data['password'] 
     # etc 
    except KeyError: 
     raise ValidationError('The password field was blank.') 

    return self.cleaned_data 
+6

1. 사람들이 사용 가능한 소스 코드를 들여다 보지 않을 것인가는 나를 깜짝 놀라게한다. – cethegeek

+1

그것은 무서울 수 있습니다. 나는 우연히 중요한 것을 변화시키고 저장하는 것을 두려워합니다. 불합리한 것, 나는 모든 것이 쉽게 대체 될 수있을 때를 안다. ;-) – SapphireSun

7

당신은 당신의 분야 생성자에 required=False를 사용하여이를 대체 할 수 있습니다 : 그 빈 필드를 사용하는 청소 방법을 처리하기 위해 다음을 수행해야합니다.

username = forms.CharField(max_length=30, required=False) 
password = forms.CharField(max_length=30,widget=forms.PasswordInput, required=False) 

이것은 당신의 예를 들어 비논리적 보이지만 유용 할 수 있습니다 경우 다른 인스턴스 forms.py을 파고에 대한

관련 문제