django sign-up form
Sign up
login form 처럼 sign up form을 만들어 보려고 한다. 역시 forms.Form을 상속받아 SignUpForm을 만들어주고
django 기본 User에서 제공해주는 last_name, first_name, email, password만 간단하게 넣어보려고 한다.
username을 따로 받지 않은 이유는 email의 값을 넣으려고 하기 때문이다.
이렇게 form을 만들고 View에서 FormView를 상속하여 만들어보자.
form_class에 form 방금 만든 폼을
success_url에는 reverse_lazy를(일반 reverse를 쓰면 View가 읽힐 때 urls를 읽은 상태가 아니라 찾지 못함)
template_name에는 우리의 html을 적어준다.
이렇게 해주면 get, post요청에 상관없이 해당하늘 form을 브라우저로 전송해주고, 받아온 값이 valid하지 않다면 다시 그 값들을 form으로 그대로 돌려주기도한다. 만약 valid하다면 succes_url로 이동시켜준다.
브라우저를 열어보면 위와 같은 화면이 생겨있는 것을 확인할 수 있다. login form에서와 마찬가지로
clean_method를 사용하여 email이 존재하는지, password가 일치하는지 확인해주는 과정을 만들어보자.
먼저 email을 가져와서 try except를 돌린다. 해당 email이 있다면 error를 일으키고, 존재하지 않는다면 email을 그대로 반환해주는 역할이다. 여기서 except User.dDoseNotExist 가 아닌 except Exception을 해줘도 될꺼라는 생각에 무심코 적었는데 제대로 오류가 발생하지 않았었다. 그 이유는 사실 잘 모르지만 DoesNotExist 에러를 명시해줬더니 말끔히 사라졌다.
그리고 password를 비교해주는 함수를 만들었다. clean_password가 아닌 clean_passwrod1로 적어준 이유는 password1 field가 password field보다 아래에 있기 때문이다. 만약 clean_passwrod 함수에서 실행시켜줬다면 password1의 값은 불러올 수가 없다.
두 비밀번호를 비교해주어 다르다면 error를 발생시켜주었다, 따로 리턴값을 주지 않았는데 그 이유는 어처피 비밀번호가 같다는 뜻이니까 password값만 있으면 되지않을까?? 라는 생각이다.
error가 발생하지 않았다면 form이 valid하다는 뜻이니까. view는 알아서 form_valid를 실행시켜줄 것이다. 우리는 이걸 오버라이딩 해서 여기서 회원가입을 시키고 바로 로그인까지 시켜주려고한다.
그 회원가입을 시켜주는 기능을 view에서가 아닌 form에서 만들어 주려고한다.
필요한 정보들을 받아온 뒤,
create가아닌 create_user를해주자, 이렇게 해주는 이유는 create로 만들게 되면 password가 hash가 되지 않은 상태로 만들어진다. create_user는 이 점을 보완해준다.
그리고 user.last_name과 first_name을 각각 채워주고 save()를해주면 잘 저장이 될 것이다.
View로 돌아와서
form_valid를 오버라이딩해주자. 이렇게하면 sign up의 기본적인 기능은 다 만들었다.