이번에는 회원탈퇴를 구현해보려고 한다.
※ views.py 수정하기
decorators.py 에서 import 한 allowed_users에 대해서는 여기서 자세히 알아볼 수 있다.
# views.py
from django.shortcuts import render
from django.contrib.auth import logout
from .decorators import allowed_users
...
@allowed_users(allowed_roles=['customer'])
def userDelete(request):
user = request.user
user.delete()
logout(request)
context = {}
return render(request, 'accounts/delete_success.html', context)
...
우선, userDelete라는 함수를 views.py에 하나 만들어준다.
user는 현재 로그인 되어 있는 사용자를 request.user로 요청하고,
이 사용자를 user.delete() 로 삭제를 시켜준다.
마지막으로 logout(request)를 통해 세션을 만료시킨다.
※ urls.py 수정하기 / template 수정하기
만약 사용자가 회원탈퇴를 선택하고 다른 페이지로 이동시켜서 회원이 탈퇴됐음을 알려주고 싶다면, 다음과 같은 페이지를 로딩 시킨다.
# urls.py
from . import views
from django.urls import path
urlpatterns = [
...
path('delete_success/', views.userDelete, name="delete_success"),
...
]
또한, 이 "Delete User" 버튼을 있을 html template도 수정시켜준다:
<!-- accounts/account_settings.html -->
...
<div class="card card-body">
<a class="btn btn-primary" href="{% url 'delete_success' %}">Delete User</a>
</div>
...
※ models.py 수정하기
우리가 사용자를 삭제하는 것까지는 구현을 했다. 하지만 만약 사용자가 주문을 해놓은 상태이면 어떻게 해야되나? 보통의 경우 우리는 사용자가 삭제된다면 그 사용자가 주문한 order들까지 함께 삭제되기를 원할 것이다. 따라서 models.py에서 우리가 삭제하고 싶은 부분을 삭제시켜줘야 한다:
# models.py
from django.db import models
from django.contrib.auth.models import User
class Customer(models.Model):
...
class Product(models.Model):
...
class Order(models.Model):
STATUS = (
('Pending', 'Pending'),
('Out for delivery', 'Out for delivery'),
('Delivered', 'Delivered'),
)
customer = models.ForeignKey(Customer, null=True, on_delete=models.CASCADE)
product = models.ForeignKey(Product, null=True, on_delete=models.CASCADE)
date_created = models.DateTimeField(auto_now_add=True, null=True)
status = models.CharField(max_length=200, null=True, choices=STATUS)
note = models.CharField(max_length=500, null=True)
def __str__(self):
return self.product.name
class Order에서 customer과 product 필드는 on_delete=models.CASCADE로 설정을 해주어야 한다. CASCADE는 바라보는 ForeignKey가 삭제될 경우, 그 해당 열 자체가 같이 삭제되게끔 설정해주는 것이다.
여기서 구현한 회원탈퇴의 방법은, 사용자가 회원 정보에 들어가서 단순히 회원탈퇴를 누르면 탈퇴할 수 있게끔 설정한 것이다. 매우 간단하게 구현한 것이므로, 다음에는 회원인증을 함과 동시에 회원탈퇴를 할 수 있게끔 해주게 구현하는 것을 한번 포스팅 해보겠다.
'Django 공부하기' 카테고리의 다른 글
<Django 공부하기> templates 폴더를 Root Directory에 정의하기 (templates 폴더를 apps 폴더 안에서 찾게 하지 않기) (0) | 2020.11.13 |
---|---|
<Django 공부하기> Customizing Admin Page (1) - Customizing Users Page (0) | 2020.11.13 |
<Django 공부하기> Forgot ID? 구현하기 (0) | 2020.11.10 |
<Django 공부하기> forms.py란 무엇인가?? Form이란 무엇인가? (0) | 2020.11.09 |
<Django 공부하기> virtualenv를 통해 Django를 사용하기 (0) | 2020.11.09 |