반응형
회원가입 장고의 django.contrib.auth 앱을 이용하면 쉽게 구현할 수 있다. 이를 가지고 구현해보즈아!
1.회원가입 템플릿 추가하기
// templates/navbar.html
<li>
{% if not user.is_authenticated %}
<a class="nav-link" href="{% url 'common:signup' %}">회원가입</a>
{% endif %}
</li>
navbar.html 템플릿에 회원가입 템플릿을 추가해준다.
반응형
2.URL 맵핑하기
navbar.html 템플릿에 {% url 'common:signup' %} 태그를 추가했으므로 여기에 대응하는 URL 매핑 규칙을 추가해야 한다.
// 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/', views.logout_view, name='logout'),
path('signup/', views.signup, name='signup'),
]
로그인 화면에서 회원가입 링크를 누르면 views.signup 함수가 실행된다.
3.forms 생성하기
뷰 함수를 만들기 전에 계정 생성시 사용할 UserForm을 common/forms.py 파일에 작성한다.
// 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 속성만 추가했다.
위에서 임포트한 UserCreationForm을 그대로 사용해도 된다.
- username - 사용자이름
- password1 - 비밀번호
- password2 - 비밀번호를 제대로 입력했는지 대조하기 위한 값
4.뷰에 추가하기
// common\\views.py
from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
from common.forms import UserForm
def logout_view(request):
logout(request)
return redirect('index')
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})
- POST 요청인 경우에는 화면에서 입력한 데이터로 사용자를 생성하고 GET 요청인 경우에는 회원가입 화면을 보여준다.
- form.cleaned_data.get : 폼의 입력값을 개별적으로 얻고 싶은 경우에 사용하는 함수로 여기서는 인증시 사용할 사용자명과 비밀번호를 얻기 위해 사용한다.
- django.contrib.auth.authenticate - 사용자 인증을 담당한다. (사용자명과 비밀번호가 정확한지 검증한다.)
- django.contrib.auth.login - 로그인을 담당한다. (사용자 세션을 생성한다.)
5.회원가입 템플릿 구현하기
// common/signup.html
{% extends "base.html" %}
{% block content %}
<div class="container my-3">
<form method="post" action="{% url 'common:signup' %}">
{% csrf_token %}
{% include "form_errors.html" %}
<div class="mb-3">
<label for="username">사용자 이름</label>
<input type="text" class="form-control" name="username" id="username"
value="{{ form.username.value|default_if_none:'' }}">
</div>
<div class="mb-3">
<label for="password1">비밀번호</label>
<input type="password" class="form-control" name="password1" id="password1"
value="{{ form.password1.value|default_if_none:'' }}">
</div>
<div class="mb-3">
<label for="password2">비밀번호 확인</label>
<input type="password" class="form-control" name="password2" id="password2"
value="{{ form.password2.value|default_if_none:'' }}">
</div>
<div class="mb-3">
<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 %}
위에서 만든 UserForm의 속성을 추가해주었다.
6.회원가입 해보기
제대로 구현했음을 알 수 있다. 회원가입을 해보자.
해보면 위와 같이 사용자 이름으로 로그인이 됨을 알 수 있다.
admin URL로 들어가면 슈퍼 유저가 아니라서 접근 가능 권한이 없다고 한다. 슈퍼 유저로 로그인해준다.
위와 같은 그룹에서 Users를 선택해준다.
방금 가입한 유저가 생긴 것을 확인할 수 있다.
반응형