2016-08-16 5 views
3

2つのフィールド(パスワードとパスワードの確認)を同じ形式で検証するのに少し問題があります。Djangoのパスワードとパスワードの確認が有効

私が作成した方法でパスワードを検証した後、パスワード確認を検証しようとすると、この変数にアクセスできなくなりました。password = self.cleaned_data['password']'None'です。

class NewAccountForm(forms.Form): 

password = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'narrow-input', 'required': 'true' }), required=True, help_text='Password must be 8 characters minimum length (with at least 1 lower case, 1 upper case and 1 number).') 
password_confirm = forms.CharField(widget=forms.PasswordInput(attrs={'class': 'narrow-input', 'required': 'true' }), required=True,) 

def __init__(self, *args, **kwargs): 
    super(NewAccountForm, self).__init__(*args, **kwargs) 
    self.fields['password'].label = "Password" 
    self.fields['password_confirm'].label = "Password Confirmation" 

「パスワード検証」< - この検証は機能しています。

def clean_password_confirm(self): 
    password = self.cleaned_data['password'] 
    password_confirm = self.cleaned_data.get('password_confirm') 

    print(password) 
    print(password_confirm) 
    if password and password_confirm: 
     if password != password_confirm: 
      raise forms.ValidationError("The two password fields must match.") 
    return password_confirm 

第二の検証(clean_password_confirm)の場合に変数としてフィールドパスワードの入力を使用する方法はありません:パスワード=「なし」のため

def clean_password(self): 
    validate_password_strength(self.cleaned_data['password']) 

この第二の検証は正しく行われていませんそれはすでに最初のメソッド(clean_password)によって検証されていますか?

ありがとうございました。

EDIT:更新バージョン:

def clean(self): 
    cleaned_data = super(NewAccountForm, self).clean() 
    password = cleaned_data.get('password') 

    # check for min length 
    min_length = 8 
    if len(password) < min_length: 
     msg = 'Password must be at least %s characters long.' %(str(min_length)) 
     self.add_error('password', msg) 

    # check for digit 
    if sum(c.isdigit() for c in password) < 1: 
     msg = 'Password must contain at least 1 number.' 
     self.add_error('password', msg) 

    # check for uppercase letter 
    if not any(c.isupper() for c in password): 
     msg = 'Password must contain at least 1 uppercase letter.' 
     self.add_error('password', msg) 

    # check for lowercase letter 
    if not any(c.islower() for c in password): 
     msg = 'Password must contain at least 1 lowercase letter.' 
     self.add_error('password', msg) 

    password_confirm = cleaned_data.get('password_confirm') 


    if password and password_confirm: 
     if password != password_confirm: 
      msg = "The two password fields must match." 
      self.add_error('password_confirm', msg) 
    return cleaned_data 

答えて

4

あなたはclean()方法で複数のフィールドをテストすることができます。

例:

def clean(self): 
    cleaned_data = super(NewAccountForm, self).clean() 

    password = cleaned_data.get('password') 
    password_confirm = cleaned_data.get('password_confirm ') 

    if password and password_confirm: 
     if password != password_confirm: 
      raise forms.ValidationError("The two password fields must match.") 
    return cleaned_data 

Cleaning and validating fields that depend on each other上のドキュメントを参照してください。

+0

ご協力いただきありがとうございます。ドキュメントを読んだあと、clean()を使ってメソッドを書き直しました。私はこれらの変更の後に自分のコードを表示するために自分の質問を編集しました。私はあなたが何か改善を提案することができれば感謝します。あなたの答えを示唆するものとして、return文を "return cleaned_data"に変更するだけです。 – revy

+0

提案していただきありがとうございました。あなたの新しいコードは正しく動作しますか?そうでない場合は、新しい質問を開きます。 – SaeX

関連する問題