학습주제
사용자와 인증
Form을 사용하여 User 생성하기
학습내용
두가지로 사용자를 만들어본다.
장고에서 제공하는 기능
장고 REST framework을 통해서 시리얼라이저를 통해 생성
이전에 polls에서 장고를 통해 question, choice를 구현
polls_api에서 장고 REST framework을 통해 question, choice를 구현.
Polls - views.py로 이동
from django.views import generic
이는 이전에 사용했었던
from rest_framework import generics
와 매우 유사하다.
뒤에 s 안붙으니 주의
또 새로운 모듈을 import
from django.urls import reverse_lazy
-> 나중에 설명
from django.contrib.auth.forms import UserCreationForm
-> 사용자를 만들수 있는 폼
class SignupView(generic.CreateView):
form_class = UserCreationForm
success_url = reverse_lazy('user-list')
template_name = 'registration/signup.html'
reverse_lazy('')
는 우리가 urls에서 정의했던 이 이름을 기반으로 url을 만들어주는 역할.
전에 템플릿에서 detail.html의 form에서 action으로
"{% url 'polls:vote' question.id %}"
형식으로 url을 만들어 준 적이 있다. 이 때 이 form의 url 명시 후 name으로 url을 만들어내는 방식과 유사하다.
view를 만들었으니 view에서 사용할 템플릿을 만들어준다. polls 템플릿 폴더에 새로운 폴더 'registration' 생성, 안에 signup.html
생성
form method는 post
지난번 배운 csrf 토큰 생성
form.as_p 아까 만들었던 views에 form_class를 그대로 사용 따라서 폼을 우리가 따로 만드는 것이 아니라 안의 내용은 form_class 즉 이전에 구현된 기능으로 대체함
순서를 다시 정리하면,
Views에서 SignupView를 generic.CreateView를 상속받아 생성 안에 Usercreationform을 만들어줘서 템플릿 - registration - signup.html에 폼을 구현함. 마지막으로 url 연결까지 마무리.
view의 SignupView를 보면 template_name이 곧 뒤에 붙을 주소를 의미한다.
장고 셀을
켜서 아까의 reverse_lazy가 어떻게 동작하는지 확인한다.
users의 상대경로는 /rest/users
로 잘 연결해준다. 앞으로 주소가 더 복잡해지기 때문에 저렇게 name을 사용한다.
이에 사용자를 만든 후에는 사용자 목록으로 보내고 싶다. 이는 polls_api - urls.py - path에 보면 name='user-list'가 있다. 이 url로 날리고 싶다.
아까 템플릿이 없다는 오류가 나서, 보통 이 경우는 뭔가 오타를 냈을꺼라 생각해서 1시간을 헤맨거 같다. 원인은 내가 실수로 templates 아래에 registration 폴더, 그리고 signup.html을 templates/polls/registration/sign.up 식으로 만들어버려, 템플릿 name 주소대로 따라가려고 해도 파일이 없다고 뜬 것이었다.
user1 계정 생성하니, user-list 화면으로 잘 넘겨주었다.
다시 singup 페이지로 돌아와
다시 user1을 만들면 에러메세지를 잘 출력해준다.
다음엔 Django REST framework을 사용한 유저 생성을 해본다.