본문 바로가기
Dev Log/Django

[Django] Form에서 비밀번호 확인하기

by 삽질하는큐 2017. 3. 10.

회원가입을 할 때 보통 비밀번호를 한 번 더 입력하여 내가 입력한 비밀번호가 제대로 된 비밀번호인지 확인하게 된다. 근데 Django의 auth.user모델을 쓰거나 해당 모델을 확장해서 쓰게 될 경우, 회원가입시 비밀번호 입력란이 하나밖에 나오지 않게 된다. 이럴 경우 어떻게 하면 될까?


class UserForm(forms.ModelForm): verify_password = forms.CharField(label = '비밀번호 확인', widget = forms.PasswordInput) class Meta: model = User fields = ('username', 'password', 'verify_password', 'first_name', 'last_name') labels = { 'username' : 'ID (E-mail)', } widgets = { 'username' : forms.EmailInput(), 'password' : forms.PasswordInput(), } def clean_verify_password(self): password1 = self.cleaned_data.get('password') password2 = self.cleaned_data.get('verify_password') if password1 != password2: raise forms.ValidationError('Emails must match') return password2

위에서 보는 바와 같이, ModelForm을 쓰게 되었을 때는 비밀번호 입력란을 하나 더 추가시켜준다. 예에서는 verify_password가 이에 해당한다.

form의 유효성 검사를 하게 될 경우, clean()과 clean_PROPERTY_NAME() 의 메소드를 사용할 수 있다. 회원가입의 경우에는 입력하는 정보가 하나 이상이기 때문에 clean()에서 유효성 검사를 하게 될 경우 위에서 부터 차례대로 ValidationError를 보낼 수 있기 때문에 여러 항목이 동시에 틀렸을 때는 위에서 나타난 오류만 사용자가 알 수 있기 때문에 회원가입을 수차례 해야 하는 번거로운 상황이 발생할 수 있다. 차라리 clean_PROPERTY_NAME()을 각 항목마다 만들어서 ValidationError를 알려주는 것이 효과적일 수 있겠다. 코드도 이게 더 깔끔하게 보인다. 


주의할 점은, Meta.fields에서 선언한 순서대로 clean 메소드가 실행되고, 현재 clean_password를 실행하고 있다면 아직 verify_password 값은 들어오지 않았기 때문에 NoneType이 된다는 것이다. 이로 인한 예외를 주의하여야 하겠다. 그래서 clean_password를 정의하는 것이 아니라 clean_verify_password를 정의해야 제대로 된 Validation이 이루어질 수 있다.