이전포스트
[Django] 1. 개발 환경 설정 https://wroni.tistory.com/4
[Django] 2 - 1. URL과 View https://wroni.tistory.com/5
[Django] 2 - 2. 모델 https://wroni.tistory.com/6
[Django] 2 - 3. 장고 관리자 https://wroni.tistory.com/7
[Django] 2 - 4. 조회와 템플릿 https://wroni.tistory.com/8
[Django] 2 - 5. URL과 네임스페이스, 2 - 6. 데이터 저장 https://wroni.tistory.com/9
[Django] 2 - 7. 스태틱 https://wroni.tistory.com/10
[Django] 2 - 8. 부트스트랩 https://wroni.tistory.com/11
[Django] 2 - 9. 템플릿 상속 https://wroni.tistory.com/12
[Django] 2 - 10. 폼 https://wroni.tistory.com/13
[Django] 3 - 1. 네비게이션바 https://wroni.tistory.com/14
[Django] 3 - 2. 페이징 https://wroni.tistory.com/15
[Django] 3 - 3. 템플릿 필터, 3 - 4. 답변 개수 표시 https://wroni.tistory.com/16
[Django] 3 - 5. 로그인과 로그아웃 https://wroni.tistory.com/18
3 - 6. 계정생성
django.contrib.auth 앱을 이용해서 계정생성 기능을 구현해볼 것이다.
1. 계정생성 링크
계정생성을 위한 링크를 login.html 템플릿에 추가할 것이다.
파일 : C:\projects\mysite\templates\common\login.html
(...생략...)
<div class="container my-3">
<div class="row">
<div class="col-4">
<h4>로그인</h4>
</div>
<div class="col-8 text-right">
<span>또는 <a href="{% url 'common:signup' %}">계정을 만드세요</a></span>
</div>
</div>
<form method="post" class="post-form" action="{% url 'common:login' %}">
(...생략...)
form 태그 위에 <div class="row">...</div> 영역을 추가해서 계정생성을 할 수 있는 링크를 추가하였다.
2. urls.py
앞에서 login.html 템플릿에서 {% url 'common:signup' %} 태그를 추가 하였기 때문에 이에 대응하는 URL 매핑을 추가해야 한다.
common/urls.py 파일에 계정생성을 위한 URL 매핑을 추가하자.
파일 : C:\projects\mysite\common\urls.py
from django.urls import path
from django.contrib.auth import views as auth_views
from . import views
app_name = 'common'
urlpatterns = [
path('login/', auth_views.LoginView.as_view(template_name='common/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(), name='logout'),
path('signup/', views.signup, name='signup')
]
이제 로그인 화면에서 계정생성 링크를 클릭하면 views.signup 함수가 실행될 것이다.
3. forms.py
뷰 함수를 만들기 전에 계정생성시 사용할 UserForm을 commons/forms.py 파일에 작성하자. forms.py 파일을 새로 생성하자.
파일 : C:\projects\mysite\common\forms.py
from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
class UserForm(UserCreationForm):
email = forms.EmailField(label="이메일")
class Meta:
model = User
fields = ("username", "password1", "password2", "email")
UserForm은 django.contrib.auth.forms 모듈의 UserCreationForm 클래스를 상속하여 만들었다.
그리고 email 속성을 추가하였다. UserForm을 따로 만들지 않고 UserCreationForm을 그대로 사용해도 되지만 위처럼 이메일 등의 부가 속성을 추가하기 위해서는 UserCreationForm 클래스를 상속하여 만들어야 한다.
상속한 UserCreationForm은 다음과 같은 속성을 가지고 있다.
속성명 | 설명 |
username | 사용자이름 |
password1 | 비밀번호1 |
password2 | 비밀번호2(비밀번호1 확인) |
UserCreationForm의 is_valid 함수는 계정생성 화면의 필드값 3개가 모두 입력되었는지,
비밀번호1과 비밀번호2가 같은지, 비밀번호의 값이 비밀번호 생성 규칙에 맞는지 등을 검사한다.
3. views.py
이제 common/views.py 파일에 signup 함수를 다음과 같이 정의할 것이다.
파일 : C:\projects\mysite\common\views.py
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from common.forms import UserForm
# Create your views here.
def signup(request):
"""
계정생성
"""
if request.method == "POST":
form = UserForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password)
# 사용자 인증
login(request, user)
return redirect('index')
else:
form = UserForm()
return render(request, 'common/signup.html', {'form' : form})
signup 함수는 POST 요청인 경우에는 화면에서 입력한 데이터로 사용자를 생성하고 GET 요청인 경우에는 계정생성 화면을 리턴한다.
form.cleaned_data.get 함수는 입력값을 개별적으로 얻고 싶은 경우에 사용하는 함수로 여기서는 사용자명과 비밀번호를 얻기 위해 사용되었다.
그리고 신규 사용자를 생성한 후에 자동 로그인 될 수 있도록 authenticate와 login 함수가 사용되었다.
authenticate와 login 함수는 django.contrib.auth 모듈의 함수로 사용자 인증과 로그인을 담당한다.
4. signup.html
이제 계정생성 화면을 구성하는 common/signup.html 템플릿을 다음과 같이 작성하자.
파일 : C:\projects\mysite\templates\common\signup.html
{% extends "base.html" %}
{% block content %}
<div class="container my-3">
<div class="row my-3">
<div class="col-4">
<h4>계정생성</h4>
</div>
<div class="col-8 text-right">
<span>또는 <a href="{% url 'common:login' %}">로그인 하세요.</a></span>
</div>
</div>
<form method="post" class="post-form" action="{% url 'common:signup' %}">
{% csrf_token %}
{% include "form_errors.html" %}
<div class="form-group">
<label for="username">사용자 이름</label>
<input type="text" class="form-control" name="username" id="username"
value="{{ form.username.value|default_if_none:'' }}">
</div>
<div class="form-group">
<label for="password1">비밀번호</label>
<input type="password" class="form-control" name="password1" id="password1"
value="{{ form.password1.value|default_if_none:'' }}">
</div>
<div class="form-group">
<label for="password2">비밀번호 확인</label>
<input type="password" class="form-control" name="password2" id="password2"
value="{{ form.password2.value|default_if_none:'' }}">
</div>
<div class="form-group">
<label for="email">이메일</label>
<input type="text" class="form-control" name="email" id="email"
value="{{ form.email.value|default_if_none:'' }}">
</div>
<button type="submit" class="btn btn-primary">생성하기</button>
</form>
</div>
{% endblock %}
상단에 "로그인" 페이지로 이동할 수 있는 링크를 추가하였고, 오류를 표시하기 위해 form_errors.html 템플릿을 include 했다.
그리고 UserForm의 속성인 사용자이름, 비밀번호1, 비밀번호2, 이메일에 해당되는 필드들을 추가했다.
5. 계정생성
웹 서버를 구동해보자. 먼저 로그인 화면에서 "계정을 만드세요" 링크를 클릭한다.
이후에 계정을 생성할 수 있는 화면이 나타난다.
만약 비밀번호1과 비밀번호2를 다르게 입력하면 오류가 나타난다.
필수값 체크와 비밀번호 생성규칙 체크, 이메일 규칙 체크 등이 모두 잘 동작하고 있다.
입력값을 올바르게 입력해서 계정을 생성하였다면, 어드민 페이지로 접속해본다. http://localhost:8000/admin/
슈퍼유저가 아닌 다른 계정으로 로그인하려고 시도하고 있으므로, 다음과 같은 오류가 뜬다.
어드민 페이지는 슈퍼유저로 접속해야 한다. 사용자 이름에 "admin", 비밀번호에 "1111"을 입력하여 로그인해보자
그리고 홈 -> 사용자 화면으로 들어가보면 다음처럼 새로 생성된 계정을 확인할 수 있다.
이제 회원가입을 성공적으로 구현하였다!
※ 본 내용은 django 공부 기록이며, 점프 투 장고를 참고하였습니다.
https://wikidocs.net/book/4223
'Django > Django 기초' 카테고리의 다른 글
[Django] 3 - 8. 글쓴이 표시 (0) | 2021.12.14 |
---|---|
[Django] 3 - 7. 모델 변경 (0) | 2021.12.09 |
[Django] 3 - 5. 로그인과 로그아웃 (0) | 2021.12.06 |
[Django] 3 - 3. 템플릿 필터, 3 - 4. 답변 개수 표시 (0) | 2021.12.06 |
[Django] 3 - 2. 페이징 (0) | 2021.12.02 |