2009-12-09 6 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場合forms.pyを掘り下げるために役立ちます。私は人々がソースコードを調べない方法を驚かせています。 – 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) 

これはあなたの例のために非論理的なようだが、他のインスタンス

関連する問題