1. forms.Form 클래스
2. forms.py
3. form 요소 생성
4. clean() 함수 오버라이딩
if username and password: # 아이디와 비밀번호를 모두 입력했을 경우
try:
user = User.objects.get(username=username) # 입력한 아이디와 일치하는 DB 인스턴스 추출
except User.DoesNotExist: # 입력한 아이디와 일치하는 정보가 없는 경우
self.add_error('username','') # username 요소 에러 출력문에 문자열 지정
return
if not check_password(password, user.password): # 입력한 비밀번호가 다른 경우
self.add_error('password','') # password 요소 에러 출력문에 문자열 지정
else:
self.user_id = user.id # 아이디와 비밀번호를 모두 입력하고 아이디가 존재하고 비밀번호가 일치할 때
# user의 id값을 form 클래스의 변수로 초기화
1. View 수정
if request.method == 'POST':
form = LoginForm(request.POST) # form 클래스를 생성해서 form 변수에 저장
if form.is_valid(): # form에 에러가 없다면
request.session['user'] = form.user_id # form 클래스에 있는 user_id 변수 값을 'user'에 지정
return redirect('/') # 홈 화면으로 request를 넘김
else:
form = LoginForm() # POST가 아닌 GET이므로 그냥 폼만 rendering
return render(request, 'login.html', {'form':form}) # form 자체를 데이터로 넘김
2. Template 수정
3. error 발생 시 결과 화면
1. 로그인 화면 접속
① 사용자 로그인 화면 Request
② URL 파싱 -> views.login(request)로 이동
③ POST가 아닌 GET 방식이므로
form = LoginForm()
④ GET방식은 폼 요소만 생성해서 form 객체 돌려줌 (clean함수 수행되지 않음)
⑤ template 전달
return render(request, 'login.html', {'form': form})
2. 로그인 요청
① 사용자 ID / PW 입력 후 로그인 Request
② URL 파싱 -> views.login(request)로 이동
③ POST 방식이므로 입력값 forms로 넘김
form = LoginForm(request.POST)
④ clean함수 수행하고 오버라이딩한 처리 로직 수행
def clean(self):
cleaned_data = super().clean()
username = cleaned_data.get('username')
password = cleaned_data.get('password')
if username and password:
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
self.add_error('username', '해당 아이디가 존재하지 않습니다.')
return
if not check_password(password, user.password):
self.add_error('password', '비밀번호가 틀렸습니다.')
else:
self.user_id = user.id
⑤ 처리 로직까지 수행한 form 객체 view로 전달해서 아래 코드 수행
form = LoginForm(request.POST)
if form.is_valid():
request.session['user'] = form.user_id
return redirect('/')