본문 바로가기
개발

[Django] sns - 사용자 등록 구현

by 마스터누누 2017. 6. 30.
728x90
반응형

sns - 사용자 등록 구현



지금까지 만든 sns 서비스는 아직 회원가입 폼이 없다.

회원가입 역시 모델을 생성하지 않아도 된다.




1
2
3
4
urlpatterns = [
  url(r'^accounts/signup$', kilogram_views.CreateUserView.as_view(), name = 'signup'),
  url(r'^accounts/login/done$', kilogram_views.ResisteredView.as_view(), name = 'create_user_done')
]
cs


우선 url을 수정해야한다.

왜냐하면 사용자 등록 관련된 url이 없기 때문이다.

urls.py에 signup과 login/done을 추가한다.

이 두가지 url의 클래스는 각각 CreateUserView와 ResisteredView가 된다.





1
2
3
4
5
6
7
8
9
10
11
from django.views.generic.edit import CreateView
from django.contrib.auth.forms import UserCreationForm
from django.core.urlresolvers import reverse_lazy
 
class CreateUserView(CreateView):
    template_name = 'registration/signup.html'
    form_class = UserCreationForm
    success_url = reverse_lazy('create_user_done')
 
class RegisteredView(TemplateView):
    template_name = 'registration/signup_done.html'
cs

이 두 뷰는 아직 views안에 생성되지 않았으므로 구현해야한다.

위 코드 상단의 from django.views.generic.edit import CreateView는 객체를 생성하는 뷰이다.

즉, 폼이나 모델과 연결해서 새로운 데이터를 넣을때 CreateView를 사용한다.


그리고 기본적인 회원가입 폼으로 UserCreationForm 이라는 것이 있다.

그러나 아쉽게도 유저의 아이디와 패스워드만 확인하고 이메일은 확인하지 않는다.

따라서 우리는 이 기본 회원가입 폼에 이메일을 추가하여 사용한다.


먼저, CreateUserView는 CreateView를 상속받아 구현한다.

template_name은 'registaration/signup.html'으로 설정하면서 signup.html과 연결한다.


또한 form_class로 UserCreationView로 넣고,

로그인이 성공하면 이동할 url을 success_url에 넣어준다.

여기서 reverse_lazy를 사용하는 이유는 generic view의 경우, 

로딩 문제때문에 reverse_lazy를 사용해야한다고 공식문서에 명시되어있다.


그 다음으로 TemplateView를 상속받는 RegisteredView 클래스를 만들어준다.

그리고 template_name 을 'registaration/signup_done.html'으로 설정해서 연결한다.


이렇게 view 설정이 완료되었고 이제 템플릿 수정만 남았다.





1
2
<br>
<p>아이디가 없으신가요? <a href="{% url 'signup'%}">회원가입</a></p>
cs


우선 login.html 에 다음과 같은 코드를 추가한다.

로그인 폼 밑에 회원가입을 유도하는 텍스트이다.

만약 회원가입을  누르게 된다면 회원 가입 페이지로 넘어가게 된다.


아직은 registration의 signup.html 템플릿이 없으므로 에러가 발생한다.





1
2
3
4
5
6
7
8
9
10
{% extends 'kilogram/base.html' %}
{% block content %}
 
<form method="post" action="{% url 'signup' %}">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">회원가입</button>
</form>
 
{% endblock %}
cs


우선 다음과 같이 signup.html을 만든다.

버튼을 클릭하면 signup url로 post 요청을 보내게 된다.

현재는 UserCreationForm을 넣었으므로 장고에서 제공해주는 폼이 출력된다.





1
2
3
4
5
6
7
8
{% extends 'kilogram/base.html' %}
{% block content %}
 
<h2>회원가입이 완료되었습니다. </h2>
<br>
<a href="{% url 'login'%}">로그인하기</a>
 
{% endblock %}
cs


또한 회원가입이 완료 되었을 때 페이지를 출력한다.

템플릿의 이름은 signup_done.html이며,

회원가입이 정상적으로 완료됨을 알리는 동시에, 로그인하기 링크를 제공한다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from django import forms
 
class CreateUserForm(UserCreationForm):
    email = forms.EmailField(required=True)
 
    class Meta:
        model = User
        fields = ("username""email""password1""password2")
 
    def save(self, commit=True):
        user = super(CreateUserForm, self).save(commit=False)
        user.email = self.cleaned_data["email"]
        if commit:
            user.save()
        return user
cs


좀 더 나아가서 이메일 필드를 추가해 보도록하자.

UserCreationForm을 수정할 것이기 때문에, CreateUserForm이라는 클래스가 상속받게 한다.

그리고 내부에 email 필드를 추가하고, 모델은 User와 연결하며,

필드는 username과 email, password1, password2를 연결한다.


그리고 저장을 위한 메소드는 save를 오버라이딩 해주는데, 

super 키워드로 부모클래스의 메소드를 호출하고 저장을 한다.

왜냐하면 아직 email을 추가하지 않았기 때문이다.

commit False에서 commit save를 하는 이유는 중복 저장을 막기 위함이다.





1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.views.generic.edit import CreateView
# from django.contrib.auth.forms import UserCreationForm
from django.core.urlresolvers import reverse_lazy
 
from .forms import CreateUserForm
 
class CreateUserView(CreateView):
    template_name = 'registration/signup.html'
    form_class =  CreateUserForm
    # form_class = UserCreationForm
    success_url = reverse_lazy('create_user_done')
 
class RegisteredView(TemplateView):
    template_name = 'registration/signup_done.html'
cs


이렇게 변경된 폼을 적용하기 위해서 views 도 수정해 줘야한다.

.forms의 CreateUserForm을 추가해준 후 CreateUserView의 form_class를 변경해준다.




출처 : 인프런, 파이썬 웹 프로그래밍, Django로 웹 서비스 개발하기

반응형

댓글