2010-07-15 15 views
1

我有一個用戶註冊表單,其中包含「密碼」和「確認密碼」字段。當我將「min_length」添加到我的密碼字段,然後通過我的自定義clean_confirm_password方法運行提交的數據時,它會提供「密鑰錯誤/密碼」錯誤。Django - 設置min_length時密碼清理失敗

當密碼字段小於5個字符時,會發生這種情況,無論confirm_password字段是否匹配。

我已經嘗試將「min_length」添加到「confirm_password」,但仍然得到相同的錯誤。

一切工作正常,當我完全刪除「min_length」。

任何幫助表示讚賞!

我forms.py文件:

class NewUser(forms.Form): 
    email = forms.EmailField(max_length=75) 
    first_name = forms.CharField(max_length=45) 
    last_name = forms.CharField(max_length=45) 
    password = forms.CharField(min_length=5, max_length=30, widget=forms.PasswordInput(render_value=False)) 
    confirm_password = forms.CharField(max_length=30, widget=forms.PasswordInput(render_value=False)) 

    def clean_confirm_password(self): 
     confirm_password = self.cleaned_data['confirm_password'] 
     original_password = self.cleaned_data['password'] 
     if original_password != confirm_password: 
      raise forms.ValidationError("Password doesn't match") 

     return confirm_password 

回答

2

如果提交的密碼少於5個字符,則驗證失敗min_length,因此password不在您的表單的cleaned_data字典中。當您嘗試訪問缺少的密鑰時,您會收到KeyError

相反,你應該嘗試:

original_password = self.cleaned_data.get('password', '') 

將返回''如果密碼太短。

另外,clean_myfieldname方法應該只依賴一個字段。如果要清理並驗證彼此依賴的字段,請使用clean方法(請參閱django docs)。

+0

這就像一個冠軍!另外,感謝您指出'clean'方法。我做了相應的修改。 – 2010-07-16 02:23:06

0

當您訪問self.cleaned_data,表單驗證其所有的領域,這將導致密碼字段爲反對其min_length參數進行驗證。

+0

對不起。我現在看到我的問題並不完全清楚。我希望密碼字段能夠按照您所描述的進行驗證,但是不會返回我的錯誤消息,它會給出密鑰錯誤。因此,如果我在密碼字段中輸入3位數字,並且在確認密碼字段(匹配與否)中輸入任何密碼,而不是給我「不足字符」錯誤,則會引發密鑰錯誤。 – 2010-07-15 23:13:22