Python/Django
[Django] form을 활용하여 login view 수정하기
jisun_rea
2020. 4. 25. 14:52
기존의 views.py
def signin(request):
if request.method == 'POST':
form = LoginForm(request.POST)
username = request.POST['username']
password = request.POST['password']
user = authenticate(username = username, password = password)
if user is not None:
login(request, user)
return redirect('video_list')
else:
return HttpResponse('Login failed. Try again.')
else:
form = LoginForm()
return render(request, 'video/user_login.html')
일단 문제는
- form을 검증하는 코드 한줄이 없다.
- form을 사용하면서, username과 password를 가져오는데 기존의 request.POST 방식을 사용하고 있는 것
- 마지막으로, login failed를 나타내는 HttpResponse를 두번째 if문의 else의 밖으로 뺴서 if문 안에 들어와서 실패하는 상황에도 에러메세지를 낼 수 있도록 하고 싶었다.
views.py 수정
def signin(request):
if request.method == 'POST':
form = LoginForm(request.POST)
if form.is_valid(): # form 검증
username = form.cleaned_data['username'] # form에서 data 가져오기
password = form.cleaned_data['password']
user = authenticate(username = username, password = password)
if user is not None:
login(request, user)
return redirect('video_list')
return HttpResponse('Login failed. Try again.') # 에러
else:
form = LoginForm()
return render(request, 'video/user_login.html')
- form.is_valid()
- form.cleaned_data
- login failed HttpResponse 위치 수정
그러나!
알맞은 username과 password로 로그인을 했는데도, login failed 응답이 왔다.
이를 해결하려고 구글링을 해보니깐...
https://stackoverflow.com/questions/45181134/django-login-error-and-cannot-login
Django login error and cannot login
I try to find a similar question but I did not find the answer what I want. I am new to Django, I was trying to learn about authentication in Django but I got an error like this: AttributeError: '
stackoverflow.com
Login Form을 수정해야 한다는 것을 알 수 있었다!
forms.py 수정
기존의 LoginForm은 다음과 같았다.
class LoginForm(forms.ModelForm):
class Meta:
model = User
fields = ['username', 'password']
여기서 수정해야하는 것은
- forms.ModelForm이 아닌, forms.Form을 상속받아야 한다.
- username과 password 필드를 직접 지정해야 한다.
그래서 다음과 같이 수정해야 한다.
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput())
- username과 password는 모두 CharField으로,
- password의 CharField의 옵션으로 widget=forms.PasswordInput()을 줘야 한다. [참고]
끝!