Django

[Django] 29. 탈퇴, 회원정보 수정 기능 구현하기

개발자 뭄뭄 2022. 11. 4. 21:19
반응형

1. 회원가입 과정은 아래를 참고합시다.

https://mummur.tistory.com/77?category=1080492

2. 로그인과 로그아웃 구현은 아래를 참고합시다.

https://mummur.tistory.com/78?category=1080492

3. 회원 탈퇴

# accounts/urls.py

urlpatterns = [
...

	path("delete/", views.delete, name="delete"),
    path("update/", views.update, name="update"),
    path("password/", views.password, name="password"),
]
# accounts/views.py

@require_POST
# 회원 탈퇴의 과정은 삭제 후 로그아웃이다.
def delete(request):
    if request.user.is_authenticated:
        request.user.delete()
        auth_logout(request)
    return redirect('movies:index')

4. 회원 정보 수정

#accounts/forms.py

from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm, UserChangeForm

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = get_user_model()
        fields = ('username',)

class CustomUserChangeForm(UserChangeForm):
    class Meta(UserChangeForm.Meta):
        model = get_user_model()
        fields = UserCreationForm.Meta.fields
				# fields를 지정하지 않으면 너무 많은 정보가 노출된다!
#accounts/views.py
from django.contrib.auth.decorators import login_required

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

# accounts/templates/update.html

{% extends 'base.html' %}
{% load bootstrap5 %}

{% block content %}
    <h1>회원 정보 수정</h1>
    <form action="{% url 'accounts:update' %}" method="POST">
        {% csrf_token %}
        {% bootstrap_form form %}
        <input type="submit" value="수정하기" class="btn btn-primary btn-sm">
    </form>

{% endblock content %}

5. 비밀번호 수정

# accounts/views.py

from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.auth import update_session_auth_hash

@login_required
@require_http_methods(["GET", "POST"])
def 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("movies:index")
    else:
        form = PasswordChangeForm(request.user)
    context = {
        'form':form,
    }
    return render(request, 'accounts/change_password.html', context)

  • 비밀번호를 변경한 직후, 로그인이 유지되어야 하기 때문에 hash를 update하는 과정이 필요하다!!

# accounts/templates/change_password.html

{% extends 'base.html' %}
{% load bootstrap5 %}

{% block content %}
  <h1>비밀번호 변경</h1>
  <form action="{% url 'accounts:change_password' %}" method="POST">
    {% csrf_token %}
    {% bootstrap_form form %}
    <input type="submit" class="btn btn-primary btn-sm">
  </form>
{% endblock content %}


Uploaded by N2T

반응형

'Django' 카테고리의 다른 글

[Django] 31. HTTP  (0) 2022.11.06
[Django] 30. DRF - Serialization  (0) 2022.11.04
[Django] 28. 1:N 관계  (0) 2022.11.04
[Django] 27. View Decorators  (0) 2022.11.04
[Django] 26. “No module named 'bootstrap5’” 오류 해결  (0) 2022.11.04