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