회원가입을 할 때 보통 비밀번호를 한 번 더 입력하여 내가 입력한 비밀번호가 제대로 된 비밀번호인지 확인하게 된다. 근데 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이 이루어질 수 있다.
'Programming > Django' 카테고리의 다른 글
[Django] Gmail SMTP 보내기 (3) | 2017.04.19 |
---|---|
[Django] Django+uWSGI에서 os.environ variable 설정하기 (0) | 2017.04.18 |
[Django] 국제화, 현지화. 각국의 언어로 번역되는 웹사이트를 만들려면? (0) | 2017.03.13 |
[Django] 오픈 소스 기반 웹 소스 코드 'Django Girls Website' 분석기 - 1 (0) | 2017.02.18 |