Django로 인스타그램 만들기 - 15. 로그인과 회원가입에 빌트인 폼 사용
참고문서
장고의 auth
애플리케이션에서는 인증과 관련된 일반적인 form
들을 제공한다.
기존에 만든 LoginForm
과 SignupForm
을 빌트인으로 제공하는 AuthenticationForm
과 UserCreationForm
을 상속받아 사용하도록 변경해본다.
Form들이 빌트인 폼을 상속받도록 변경하며, class속성을 재정의 하기 위해 초기화 메서드 __init__()
을 오버라이드 해 준다
member/forms.py
from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import AuthenticationForm, UserCreationForm
User = get_user_model()
class LoginForm(AuthenticationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
class_update_fields = ['username', 'password']
for field_name in class_update_fields:
self.fields[field_name].widget.attrs.update({
'class': 'form-control'
})
class SignupForm(UserCreationForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
class_update_fields = ['password1', 'password2']
for field_name in class_update_fields:
self.fields[field_name].widget.attrs.update({
'class': 'form-control'
})
class Meta:
model = User
fields = (
'username',
'password1',
'password2',
)
widgets = {
'username': forms.TextInput(
attrs={
'class': 'form-control',
}
),
}
login 뷰 수정
member/views.py
def login(request):
if request.method == 'POST':
# 로그인 성공 후 이동할 URL. 주어지지 않으면 None
next = request.GET.get('next')
# Data bounded form인스턴스 생성
# AuthenticationForm의 첫 번째 인수는 해당 request가 되어야 한다
login_form = LoginForm(request=request, data=request.POST)
# 유효성 검증에 성공할 경우
# AuthenticationForm을 사용하면 authenticate과정까지 완료되어야 유효성 검증을 통과한다
if login_form.is_valid():
# AuthenticatonForm에서 인증(authenticate)에 성공한 유저를 가져오려면 이 메서드를 사용한다
user = login_form.get_user()
# Django의 auth앱에서 제공하는 login함수를 실행해 앞으로의 요청/응답에 세션을 유지한다
django_login(request, user)
# next가 존재하면 해당 위치로, 없으면 Post목록 화면으로 이동
return redirect(next if next else 'post:post_list')
# 인증에 실패하면 login_form에 non_field_error를 추가한다
login_form.add_error(None, '아이디 또는 비밀번호가 올바르지 않습니다')
else:
login_form = LoginForm()
context = {
'login_form': login_form,
}
return render(request, 'member/login.html', context)
AuthenticationForm
의 특정 동작에 맞게 뷰를 수정해야 한다. 자세한 내용은 문서를 참고한다.
signup 뷰 수정
def signup(request):
if request.method == 'POST':
signup_form = SignupForm(request.POST)
# 유효성 검증에 통과한 경우 (username의 중복과 password1, 2의 일치 여부)
if signup_form.is_valid():
# 유저를 생성 후 해당 User를 로그인 시킨다
user = signup_form.save()
django_login(request, user)
return redirect('post:post_list')
else:
signup_form = SignupForm()
context = {
'signup_form': signup_form,
}
return render(request, 'member/signup.html', context)
달라지는 부분은 save()
의 호출이며, 추가로 회원가입한 사용자를 바로 로그인시킨다.