본문 바로가기
개발/파이썬

중고거래 사이트 만들기 2

by Engineer-Lee 2022. 5. 21.
반응형

지난 시간에는 유저이름과 비밀번호를 통해 회원가입, 로그인 로그아웃을 하도록 구현해봤다.

 

그러나 요즘 웹사이트에선 유저이름 대신 이메일로 로그인을 한다.

우리도 이메일로 로그인을 하도록 수정해보자

settings.py에 아래 코드를 추가한다.

계정 인증 방법은 email로 하고 회원가입과 로그인시 email란은 필수이고 더 이상 username은 사용하지 않는다.

 

 

 

 

 

유저 모델에 str메서드 또한 바꿔줘야 한다.
이는 username이 기본값으로 설정되어 있어서 오버라이딩으로 email이 출력되도록 코드를 입력한다. 

 

이메일로 회원가입과 로그인을 했지만 그 후 유저간의 구분은 닉네임으로 하고 싶다.

따라서 models.py에 닉네임 필드를 추가하자

이후에 python manage.py makemigrations 을 입력하면 기존에 저장된 유저데이터의 닉네임 필드가 비어있기 떄문에 마이그레이션 진행이 안된다.
이를 해결하려면 닉네임필드에 디폴트값을 넣어야하지만
문제는 닉네임이 unique해야하므로 마이그레이션이 결국 실패한다.

 

따라서 우리는 null값이 들어갈 수 있도록 null=True를 닉네임 필드에 추가한 후 관리자페이지에서 닉네임을 수정해야 한다.

다시 닉네임 필드를 아래와 같이 입력하고

makemigrations 와 migrate를 진행한다.

 

 

유저모델에 대한 추가필드는 기본적으로 관리자페이지에 나타나지 않기에 admin.py에 아래 코드를 추가한다.

 

그리고 관리자 페이지에서 한 유저 정보를 보면 닉네임란이 생겼다.

 

회원가입 페이지에도 닉네임란을 추가해야 한다.

 

닉네임은 유저가 입력한 것을 form을 통해 받기에 form을 커스터마이징 해보자

모델폼으로 기본 모델인 User에 대한 폼을 만들고 추가할 필드인 nickname을 추가한다.

그리고 signup 함수를 통해 추가한 필드인 nickname에 대한 로직을 만든다.

폼에서는 입력된 값이 유효하면 cleaned_data에 담겨져온다.

 

 

settings.py에선 우리가 만든 SignupForm을 사용하겠다는 설정을 입력하자

 

index.html에는 로그인시 닉네임도 볼 수 있게 수정한다.

 

 

 

이제 회원가입 페이지에서 닉네임란이 생겼다.

 

또한 로그인시 닉네임이 보인다.

 

 

기본 언어가 영어로 되어있어 회원가입이나 로그인시 영어로 문구가 뜨는 걸 고치기 위해 settings.py에서 언어 코드를 수정하자

 

 

이제 닉네임과 비밀번호에 대한 유효성 검사를 다뤄보자

이를 위해 validators.py를 작성한다.

validators.py의 일부 코드이다. 비밀번호는 8자 이상이여야 하고 대소문자, 숫자, 특수문자를 모두 포함해야 한다.

닉네임에는 특수문자가 포함되지 않아야 한다.

 

그리고 settings.py에서 우리가 만든 유효성 검사를 이용하기 위해 기존에 있던 AUTH_PASSWORD_VALIDATORS를 지우고 아래와 같이 수정한다.

그럼 닉네임과 비밀번호에 대해 유효성검사가 이루어진다.

한가지 아쉬운 점이 있다면 비밀번호가 유효성검사를 통과해도 닉네임이 유효하지 않다면
입력했던 비밀번호가 다 지워져서 다시 입력해야 한다는 것이다.

 

이를 막기위해 settings.py에 아래 코드를 추가한다.

 

이로서 비밀번호가 다 지워지는 문제를 해결했다.

 

 

이번에는 이메일 인증과정 거쳐서 회원가입을 할 수 있게 해보자

settings.py에 아래 코드를 추가한다.

optional 값을 통해 회원가입시 이메일 인증을 하지않아도 로그인이 가능하다.

그러나 이메일 인증을 하지 않은 유저는 여러 기능 사용에 제한을 주도록 할 예정이다. 

사실 ACCOUNT_EMAIL_VARIFICATION의 기본값은 optional이므로 코드를 추가하지 않아도 상관은 없다.

 

그리고 유저가 받은 링크를 클릭하면 회원가입 완료되게끔 아래 코드도 추가한다.

 

이제 이메일인증 링크를 누르면 홈페이지로 이동하면서 로그인이 된다.

이것 대신에 이메일 인증이 완료됐다는 페이지로 리디렉션을 시켜줘보자

settings.py에 아래 코드를 추가한다.

 

그리고 project 폴더의 urls.py로 가서 아래와 같이 수정한다.

장고에서는 단순히 템플릿을 render할 때는 제네릭뷰의 템플릿뷰를 사용하면 된다.

이 템플릿뷰의 장점은 따로 뷰를 정의하지 않아도 사용할 수 있다.

 

email_confirmation_done.html도 작성한다.

사용자가 회원가입을 통해 로그인이 된 상태라면 홈으로 이동하는 링크를 제공하고

회원가입을 하지않은 유저가 그저 이메일 인증url만을 받아서 접근한 경우에는 로그인하는 링크를 제공한다. 

 

 

자 이제 회원가입을 하고

이메일 인증 링크를 들어가면

이메일 확인이 된다.

 

 

 

마지막으로 비밀번호 변경 기능을 추가해보자

index.html에서 로그인이 된 상태인 경우 홈페이지에서 비밀번호 변경 링크를 추가한다.

 

 

그리고 비밀번호를 변경해보면 변경됐다는 메세지는 나오나 페이지는 그대로이다.

 

이를 수정하기 위해선 PasswordChangeView를 상속받아서 로직을 바꿔야 한다.

views.py에 아래 코드를 추가한다.

CustomPasswordChangeView 클래스를 만들고

get_success_url 메서드에 index.html로 리디렉션 되도록 오버라이딩 한다.

 

그리고 urls.py에 CustomPasswordChangeView를 이용하도록 한다.

반응형