장고 개인과제에 이은 팀프로젝트가 시작되었습니다. 저희 조는 역할군을 나누어 협업하기로 했고 저는 회원가입, 로그인, 로그아웃 기능을 구현하게 되었습니다. 기능의 구현을 위해 먼저 erd, 모델, 폼의 설계를 맡으신 분의 자료가 들어오고 본격적인 작업이 시작됐습니다.
먼저 회원가입의 기능 구현 이전에 모델과 폼을 인계 받았는데 폼을 활용해 사이트를 구성하다보니 모델이 필요가 없어져 회의 끝에 모델은 사용하지 않기로 결정했습니다. 회원가입 페이지에서 받을 요소는 이름, 암호, 암호확인, 자기소개 입니다.
# forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class UserForm(UserCreationForm):
bio = forms.CharField()
class Meta:
model = User
fields = ['username', 'password1', 'password2', 'bio']
UserForm
클래스는 UserCreationForm
을 상속받게 만들어 모델없이 객체를 생성하는데 이상이 없게 만들고 기본적으로 들어가있지 않는 요소인 bio
요소를 따로 만들어 주었습니다.
# views.py
def signup(request):
form = UserForm()
if request.method == 'GET':
return render(request, 'user/signup.html', { 'form' : form })
elif request.method == "POST":
form = UserForm(request.POST)
if form.is_valid():
form.save()
return redirect('/user/login')
else:
form = UserForm()
return render(request, 'user/signup.html', {'form' : form})
회원가입 함수인 signup
함수입니다. forms.py
에서 UserForm
을 받아오고 GET
메서드를 받으면 해당 html을 form
양식에 맞춰 리턴해주고 POST
를 받으면 입력받은 정보를 UserForm
에 넘긴 다음 is_valid
함수를 사용합니다.
is_valid
함수는 form
에 입력된 값들이 유효한지를 판단해 True
혹은 False
를 반환합니다. True
가 나왔다면 해당 값이 유효한 것이기 때문에 해당 form
을 데이터베이스에 저장하고 로그인 페이지로 이동하게 만들었습니다.
False
가 나왔다면 유효한 값이 아니기 때문에 다시 form
에 비어있는 UserForm
을 할당해주고 해당 html을 다시 리턴해줍니다.
회원가입과 동시에 로그인이 된 후 로그인이 된 상태의 페이지를 띄우고 싶었는데 제 코드를 기다리는 팀원이 많아 기능에는 이상이 없는 저 코드를 먼저 건네주게 되었습니다.
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
password = form.cleaned_data.get('password1')
user = authenticate(request, username=username, password=password)
login(request, user)
return redirect('/user/login')
위의 코드에서 수정한 작업물인데 login
함수에 필요한 인자는 request와 입력정보를 가진 인자로 나오는데 어째서 인자로 하나만 올 수 있다고 나오는지 의문이군요..
팀원분들의 도움으로 돌파구를 찾았습니다 밑에 login
함수가 있는데 해당 함수와 이름이 동일해 생기는 오류 같다는 의견이 나왔습니다. 내일 바로 테스트해보고 결과 올리겠습니다.