본문 바로가기
Project/pre-print-project

Django 장고 form사용 및 user모델 생성, 로그인+로그아웃 & 회원가입 기능 구현

by 지식을 쌓는 개구리 2023. 8. 2.

pre-print 개발일지

 

7/25~7/28 

모델 생성

다음과 같이 유저모델을 생성하였다.

장고에서 지원하는 클래스를 상속받아 사용하고

User라는 클래스를 커스텀하여 사용하고 있다.

현재는 phone이라는 정보만 테스트 삼아 추가하였으나

이후 프린트 사업에 필요한 정보를 수집하여 추가할 예정이다.

 

커스텀한 모델을 사용하기 위해 settings.py에 이 부분을 추가하자

AUTH_USER_MODEL = 'users.User'

form을 사용하여 회원가입과 로그인, 로그아웃 구현

from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm

class SignUpForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = get_user_model()
        fields = ['username', 'email', 'phone']

 

다음과 같이 장고에서 지원하는 form을 사용하여

회원가입과 로그인에 필요할 폼을 쉽게 만들었다.

 

회원가입 구현

def print_signup(req):
    if req.method == 'GET':
        form = SignUpForm()
        context = {'form': form}
        return render(req, 'accounts/print_signup.html', context)
    else:
        form = SignUpForm(req.POST)
        if form.is_valid():
            instance = form.save()
            return redirect('main')
        else:
            return redirect('accounts:signup')

요청방식이 GET일 때는 폼을 출력하고 회원가입 페이지로 넘기고

정보를 작성하고 제출할 때, 요청이 POST일 경우 form의 유효성을 검사하고

올바른 정보이면 정보를 저장하며 회원가입을 완료한 후 main페이지로 넘긴다.

혹 유효성 검사에서 실패할 경우(비밀번호 부적합, 정보 누락) 회원가입 페이지로 리로딩한다.

 

로그인 구현

from django.contrib.auth.forms import AuthenticationForm
def print_login(req):
    if req.method == 'GET':
        return render(req, 'accounts/print_login.html', {'form': AuthenticationForm()})
    else:
        form = AuthenticationForm(req, req.POST)
        if form.is_valid():
            login(req, form.user_cache)
            return redirect('main')
        else:
            return render(req, 'accounts/print_login.html', {'form': form})

이미 장고에서 다 지원하고 있는 인증 폼을 사용하여 회원가입의 구현방식과 동일하게 GET, POST방식에 따라

구분하여 준다.

로그인을 시도하는 => POST 요청일 경우 폼의 유효성을 다시 체크하고 올바른 정보라면 login 한다.

정보가 일치하지 않을 경우 login페이지로 리로딩한다.

 

로그아웃 구현

def print_logout(req):
    if req.user.is_authenticated:
        logout(req)
    return redirect('main')

이미 장고에서 지원하는 폼을 사용하니 상당히 편하다.

유저가 인증되어 있는, 즉 로그인되어 있는 상태에서 로그아웃을 요청하면

바로 logout을 진행하고 main으로 돌려보내준다.

 

 

이미 존재하는 장고의 form을 사용하니 구현이 쉬웠다. 강의에서 진행하던 방식을

사용했기에 숙련도를 위해서 기존의 폼 말고 새롭게 만드는 과정도 거쳐봐야 이해도가 상승할 것 같다.