일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- lambda
- SSA
- async
- dict
- Props
- 파이썬
- NeXT
- 카톡
- flask
- RDS
- Vue
- TypeScript
- merge
- react
- docker
- 채팅
- socket io
- 중급파이썬
- crud
- node
- EC2
- wetube
- 튜플
- Class
- git
- pandas
- SAA
- MongoDB
- AWS
- S3
- Today
- Total
초보 개발자
django sign-up form with model form 본문
forms.Form으로 구현해보았지만 이번엔 ModelForm을 사용해보려고한다.
model form은 자체에 clean함수와 save함수가 있다.
이전에는 clean함수를 만들어 우리가 직접 field값을 validate해주었다. (오류 발생 등) 하지만 model form을 사용하면 알아서 unique한 값을 validate해준다.
즉 User.obects.get(username=email)이런식으로 해주어 찾고 경우에 따라 에러를 발생시켜줬는데 이걸 알아서 해준다는 말이다.
form.ModelFrom 을 상속하고나서 실행시키면 당연히 오류가 발생한다. 어떤 모델을 사용한다는지 장고는 모르기 때문이다. 따라서 Meta클래스에 정보를 주어야한다.
model에 우리가 사용할 모델을 넣어주고 fields에는 우리가 자동으로 받아와서 validate를 할 field를 적어준다.
여기에 password를 따로 적지 않았는데 그 이유는 password1과 비교를 해줘야하기도 하고 저기에 넣어버리면 뭔가 해쉬도 잘 안되는 것 같다??
clean_email함수는 지워주어도 되지만 clean_password1함수는 남겨주어야 한다. 비밀번호를 비교해야하기때문이다.
field에 들어가 있는 항목들은 자동으로 save()시 들어가지만 이렇게 밖으로 빼준 것은 save(commit=false)로해두고 우리가 일일이 넣어주어야 한다.
이상태로 회원가입을 해준다면 models에서 default로 정해준 값들과 저기 fields에 적힌 값들만 저장이 되어 회원가입이 완료된다. 저기에서 다루지 않은 username은 공백값이 들어가게 된다.
따라서 우리는 비밀번호를 확인해주는 기능과 username에 email을 넣어주기위해 save를 다시 오버라이딩해주어야한다.
상속한 save를 commit=False옵션으로 일단 저장한다. 이 옵션은 obj는 생성하되 데이터베이스에는 저장을 하지 말라는 뜻이다. 전에 create_user를해버리면 바로 저장이 되었던데 아마 바로 저장하는 걸 막으려고 하는 것 같다.
username에 email을 넣어주고 password도 set_password를 사용하면 해쉬가 잘 되어진다. 이를 추가한 후 user.save()해주면 비로소 데이터베이스에도 저장이 된다.
-----------------------------------------
clean_email이 존재하지 않아도 된다고 생각했는데, 우리는 username에 email을 넣어주는 형식을 사용하고 있다. 근데 이 email은 unique가 아니기 때문에 clean이 validate해주지 못한다. 따라서 form.save()를 하는 순간에 username에 email을 넣어버리니까
기존 유저의username의 값과 현재 가입할 유저의 email이 겹쳐버리면 오류가 발생한다. 따라서 사전에 차단해주어야 한다.
'Python > airbnb 클론' 카테고리의 다른 글
django password_validator (0) | 2022.02.21 |
---|---|
send email django (0) | 2022.02.18 |
django sign-up form (0) | 2022.02.16 |
django login form 2 with FormView (0) | 2022.02.15 |
django login form 1 (0) | 2022.02.15 |