본문 바로가기

Python/Django

[Django] form을 활용하여 login view 수정하기

기존의 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')

일단 문제는

  1. form을 검증하는 코드 한줄이 없다.
  2. form을 사용하면서, username과 password를 가져오는데 기존의 request.POST 방식을 사용하고 있는 것
  3. 마지막으로, 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')

 

  1. form.is_valid()
  2. form.cleaned_data
  3. 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']

여기서 수정해야하는 것은

  1. forms.ModelForm이 아닌, forms.Form을 상속받아야 한다.
  2. username과 password 필드를 직접 지정해야 한다.

그래서 다음과 같이 수정해야 한다.

class LoginForm(forms.Form):
    username = forms.CharField()
    password = forms.CharField(widget=forms.PasswordInput())
  • username과 password는 모두 CharField으로,
  • password의 CharField의 옵션으로 widget=forms.PasswordInput()을 줘야 한다. [참고]

 

끝!