티스토리 뷰

반응형

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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함