2016-08-16 4 views
3

У меня есть небольшая проблема с проверкой двух полей (подтверждение пароля и пароля) в той же форме.Проверка подтверждения пароля и пароля 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(self): 
    validate_password_strength(self.cleaned_data['password']) 

Эта вторая проверка не выполняется правильно, потому что пароль = «None»:

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), если он уже проверен первым методом (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

Смежные вопросы