[Django]사용자인증관리_회원탈퇴
0.들어가면서
게시물을 봤을 때, accounts/user_id/delete 해야할 것 같다. id가 3이라면 /accounts/3/delete/하면 id가 3인 사람이 지워질거다. 그러나 회원정보는 세션 정보로 판단이 가능하기 때문에 그냥 'delete/'해도 된다.
urls.py
path('delete/', views.delete, name='delete'),
views.py
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_POST
@require_POST
@login_required
def delete(request):
request.user.delete()
return redirect('articles:index')
로그인한 정보는 request 안에 담겨 있기 때문에 url로 굳이 할 필요가 없다. request.user는 로그인한 유저의 정보라는 뜻이고 .delete()는 그 정보를 삭제하겠다는 의미이다.
/accounts/detail.html
{% block body %}
<h1>{{ user.pk }} : {{ user.username }}</h1>
{% if request.user == user %}
<form action="{% url 'accounts:delete' %}" method="POST">
{% csrf_token %}
<button class="btn btn-secondary">회원 탈퇴</button>
</form>
{% endif %}
<hr>
{% endblock %}
회원 탈퇴가 가능한 form을 적어준다. 만약 이때, a 태그를 쓰지 않고 form 태그를 쓰는 이유는 url로 지워지는 것을 막기 위해서 이다. 따라서 POST 요청으로만 처리하고 싶으면 form을 쓰면 된다. 그리고 views에서는 require_POST를 쓰면 되고 로그인은 @login_required를 추가하면된다.
{% if request.user == user %}
로그인한 자신의 detail.html에서만 가능하게 설정한 것이다.
게시글 삭제와 id삭제를 비교
@require_POST
@login_required
def delete(request, pk):
article = get_object_or_404(Article, pk=pk)
article.delete()
return redirect('articles:index')
id 삭제는 request.user로 불어왔다면 게세글에서는 article이 어떠한 글인지를 url에서 넘어온 pk를 통해 판단한다