AI웹 개발자 과정 공부 (팀스파르타)/Django (장고)
24.04.25_TIL (1) (Django 회원가입, 탈퇴, 정보수정)
티아(tia)
2024. 4. 25. 15:41
728x90
++ 장고 공식 문서는 항상 확인하기
https://docs.djangoproject.com/en/4.2/
1. 회원가입하기
- accounts 의 urls.py 수정하기
path("signup/", views.signup, name="signup"),
- accounts 의 views.py 수정하기
from django.contrib.auth.forms import UserCreationForm
....
def signup(request):
if request.method == "POST":
form = UserCreationForm(request.POST)
if form.is_valid():
form.save()
return redirect("index")
else:
form = UserCreationForm()
context = {"form": form}
return render(request, "accounts/signup.html", context)
- accounts 의 templates 의 signup.html 만들어주기
{% 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 content %}
- 회원가입을 하고 나면 바로 로그인 버튼이 사라지고 index 화면이 나오도록 하자
- base.html 을 바꾸어준다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="navbar">
{% if request.user.is_authenticated %}
<h3>안녕하세요, {{ user }}님</h3>
<form action="{% url 'accounts:logout' %}" method="POST">
{% csrf_token %}
<input type="submit" value="로그아웃">
</form>
{% else %}
<a href="{% url 'accounts:login'%}">로그인</a>
<a href="{% url 'accounts:signup'%}">회원가입</a>
{% endif %}
</div>
<div class="container">
{% block content %}
{% endblock content %}
</div>
</body>
</html>
- accounts 의 views.py 수정하기
@require_http_methods(["GET", "POST"])
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)
2. 회원 탈퇴하기
- accounts 의 urls.py 수정하기
path("delete/", views.delete, name="delete"),
- accounts 의 views.py 수정하기 - 탈퇴하면 해당 유저의 세션도 지우려면 logout 까지 같이 해야함
@require_POST
def delete(request):
if request.user.is_authenticated:
request.user.delete()
auth_logout(request)
return redirect("index")
- base.html 을 바꾸어준다.
<form action="{% url 'accounts:delete' %}" method="POST">
{% csrf_token %}
<input type="submit" value="회원탈퇴"></input>
</form>
- 진짜 탈퇴가 되는지 살펴보자.
- 회원탈퇴 버튼을 누르고 나면 db에서도 없어진 모습을 볼 수 있다.
3. 회원 정보수정
- accounts 의 urls.py 수정하기
path("update/", views.update, name="update"),
- accounts 의 views.py 수정하기 - 탈퇴하면 해당 유저의 세션도 지우려면 logout 까지 같이 해야함
- 장고의 파일에는 회원정보의 수정에 대해 기본적으로 많은 정보가 들어가있다. 그래서 그 정보를 제외한 것을 보여주기 위해 따로 관리를 해줘야 한다. forms.py 로 관리해주자.
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 의 forms.py만들기
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 의 templates 의 update.html 만들어주기
{% extends "base.html" %}
{% block content %}
<h1>회원정보수정</h1>
<form action="{% url 'accounts:update' %}" method="POST">
{{ form.as_p }}
{% csrf_token %}
<button type="submit">수정하기</button>
</form>
{% endblock %}
- base.html 을 바꾸어준다. - 회원정보수정칸을 만들어줌
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div class="navbar">
{% if request.user.is_authenticated %}
<h3>안녕하세요, {{ user }}님</h3>
<form action="{% url 'accounts:logout' %}" method="POST">
{% csrf_token %}
<input type="submit" value="로그아웃"></input>
</form>
<a href="{% url 'accounts:update'%}">회원정보수정</a>
<form action="{% url 'accounts:delete' %}" method="POST">
{% csrf_token %}
<input type="submit" value="회원탈퇴"></input>
</form>
{% else %}
<a href="{% url 'accounts:login'%}">로그인</a>
<a href="{% url 'accounts:signup'%}">회원가입</a>
{% endif %}
</div>
<div class="container">
{% block content %}
{% endblock content %}
</div>
</body>
</html>
4. 회원 정보수정에서 비밀번호 변경하기
- accounts 의 urls.py 수정하기
path("password/", views.change_password, name="change_password"),
- accounts 의 views.py 수정하기
from django.contrib.auth.forms import PasswordChangeForm, UserCreationForm
from django.contrib.auth import update_session_auth_hash
...
@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)
- change_password.html 를 만들어준다.
{% 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 content %}
- accounts 의 forms.py 에서 수정하기
from django.urls import reverse
...
class CustomUserChangeForm(UserChangeForm):
class Meta:
model = get_user_model()
fields = (
"username",
"email",
"first_name",
"last_name",
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.fields.get("password"):
password_help_text = (
"You can change the password " '<a href="{}">here</a>.'
).format(f"{reverse('accounts:change_password')}")
self.fields["password"].help_text = password_help_text
반응형