로그인 기능을 구현하였을 때 처음부터 등록되어 있던 admin 계정을 사용해서 로그인했었지만 다른 사람이 로그인하기 위해서는 사용자가 회원가입을 할 수 있는 기능이 추가되어야 한다. Django에는 django.contrib.auth 앱을 사용해서 회원가입 기능을 구현할 수 있다.
로그인 페이지에 회원가입 링크 추가
<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>...
from . import views
...
urlpatterns = [
...
path('signup/', views.signup, name='signup'),
]
회원가입에 사용할 폼 생성 - 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", "email")
common/views.py에 signup 함수 정의
from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from common.forms import UserForm
def signup(request):
# 회원가입
# POST 요청일 때 입력된 데이터로 사용자 생성
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')
# GET 요청일 때 회원가입 페이지를 표시
else:
form = UserForm()
return render(request, 'common/signup.html', {'form': form})
회원가입 템플릿 - 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-end">
<span>또는 <a href="{% url 'common:login' %}">로그인 하세요.</a></span>
</div>
</div>
<form method="post" class="post-form">
{% 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 %}
회원가입 링크 및 회원가입 화면 확인