Post

Django: 회원 관리 기능 구현

Django를 사용하여 회원가입, 회원탈퇴, 정보 수정, 비밀번호 변경 기능을 구현하는 방법을 단계별로 설명합니다.

Django: 회원 관리 기능 구현

Django는 회원 관리와 관련된 기능을 효율적으로 구현할 수 있도록 다양한 도구와 메소드를 제공합니다. 이번 글에서는 Django를 활용해 회원가입, 회원탈퇴, 정보 수정, 비밀번호 변경 기능을 단계적으로 구현해보겠습니다.

1. 회원가입 구현

기본 개념

Django는 기본적으로 auth.User 모델을 제공하며, 이를 기반으로 한 UserCreationForm을 사용하여 회원가입 기능을 간단히 구현할 수 있습니다.

코드 구현

accounts/views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render, redirect

def signup(request):
    if request.method == "POST":
        form = UserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            auth_login(request, user)  # 가입 후 자동 로그인
            return redirect("index")
    else:
        form = UserCreationForm()
    context = {"form": form}
    return render(request, "accounts/signup.html", context)

accounts/templates/accounts/signup.html

1
2
3
4
5
6
7
8
9
10
11
12
{% extends "base.html" %}

{% block content %}
<h1>회원가입</h1>
<form action="{% url 'accounts:signup' %}" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">회원가입</button>
</form>
{% endblock %}

base.html

1
2
3
<a href="{% url 'accounts:signup' %}">회원가입</a>

2. 회원탈퇴 구현

기본 개념

회원탈퇴는 User 객체를 삭제하여 구현할 수 있습니다. Django의 delete() 메소드를 호출하여 사용자를 데이터베이스에서 제거합니다.

코드 구현

accounts/urls.py

1
2
3
4
5
6
7
from django.urls import path
from . import views

app_name = "accounts"
urlpatterns = [
    path("delete/", views.delete, name="delete"),
]

accounts/views.py

1
2
3
4
5
6
7
8
9
10
from django.contrib.auth import logout as auth_logout
from django.views.decorators.http import require_POST
from django.shortcuts import redirect

@require_POST
def delete(request):
    if request.user.is_authenticated:
        request.user.delete()
        auth_logout(request)  # 세션 삭제
    return redirect("index")

base.html

1
2
3
4
5
6
<form action="{% url 'accounts:delete' %}" method="POST">
    {% csrf_token %}
    <input type="submit" value="회원탈퇴">
</form>

3. 정보 수정 구현

기본 개념

기본 UserChangeForm을 사용해 사용자의 정보를 수정할 수 있습니다. 필요에 따라 이를 상속받아 커스텀 폼을 만들어 사용할 수 있습니다.

코드 구현

accounts/forms.py

1
2
3
4
5
6
7
from django.contrib.auth.forms import UserChangeForm
from django.contrib.auth import get_user_model

class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = get_user_model()
        fields = ("username", "email", "first_name", "last_name")

accounts/views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from django.views.decorators.http import require_http_methods
from .forms import CustomUserChangeForm

@require_http_methods(["GET", "POST"])
def update(request):
    if request.method == "POST":
        form = CustomUserChangeForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            return redirect("index")
    else:
        form = CustomUserChangeForm(instance=request.user)
    context = {"form": form}
    return render(request, "accounts/update.html", context)

accounts/templates/accounts/update.html

1
2
3
4
5
6
7
8
9
10
11
12
{% extends "base.html" %}

{% block content %}
<h1>회원정보수정</h1>
<form action="{% url 'accounts:update' %}" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">수정하기</button>
</form>
{% endblock %}

base.html

1
2
3
<a href="{% url 'accounts:update' %}">회원정보수정</a>

4. 비밀번호 변경 구현

기본 개념

PasswordChangeForm을 활용하여 사용자가 비밀번호를 변경할 수 있습니다. 비밀번호를 변경하면 기존 세션이 무효화되므로, update_session_auth_hash를 사용해 새로운 세션 인증을 갱신할 수 있습니다.

코드 구현

accounts/urls.py

1
2
3
urlpatterns = [
    path("password/", views.change_password, name="change_password"),
]

accounts/views.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.decorators import login_required

@login_required
@require_http_methods(["GET", "POST"])
def change_password(request):
    if request.method == "POST":
        form = PasswordChangeForm(request.user, request.POST)
        if form.is_valid():
            form.save()
            update_session_auth_hash(request, form.user)  # 세션 갱신
            return redirect("index")
    else:
        form = PasswordChangeForm(request.user)
    context = {"form": form}
    return render(request, "accounts/change_password.html", context)

accounts/templates/accounts/change_password.html

1
2
3
4
5
6
7
8
9
10
11
12
{% extends "base.html" %}

{% block content %}
<h1>비밀번호 변경</h1>
<form action="{% url 'accounts:change_password' %}" method="POST">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">비밀번호 변경</button>
</form>
{% endblock %}

결론

이번 글에서는 Django의 기본 기능을 활용해 회원관리 기능을 구현해 보았습니다. Django의 강력한 인증 시스템을 통해 간단하면서도 안전한 회원 관리 기능을 구축할 수 있습니다.

This post is licensed under CC BY 4.0 by the author.