urls.py
, template
은 생략
이전에는 AbstractUser
를 상속한 model을 사용해서 회원가입을 구현했지만 이번에 강의를 들으며 다른 방법으로 구현하는 방법을 알게 되어 기록하기로 했다.
views.py
from django.contrib.auth.forms import UserCreationForm
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)
Django에 내장된 UserCreationForm
을 사용
@require_POST
def delete(request):
if request.user.is_authenticated:
request.user.delete()
auth_logout(request)
return redirect("index")
일반 CRUD와 같이 DB에서 해당 정보를 찾아 삭제하면 된다.views.py(초기)
from django.views.decorators.http import require_http_methods
from django.contrib.auth.forms import (
...
UserChangeForm,
)
...
@require_http_methods(["GET", "POST"])
def update(request):
if request.method == "POST":
pass
else:
form = UserChangeForm(instance=request.user)
context = {"form": form}
return render(request, "accounts/update.html", context)
views.py를 위처럼 사용하면 화면에 관리자 페이지에서 출력되는 암호화된 패스워드, superuser 여부, 권한, 마지막 로그인, 가입 날짜 등 수정하면 안되는 정보까지 출력되기 때문에 UserChangeForm을 상속해서 커스텀한다.
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",
)
views.py(완성본)
from django.views.decorators.http import require_http_methods
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)
views.py(초기)
from django.contrib.auth.forms import PasswordChangeForm
@login_required
@require_http_methods(["GET", "POST"])
def change_password(request):
form = PasswordChangeForm(request.user)
context = {"form": form}
return render(request, "accounts/change_password.html", context)
회원정보 수정 화면에서 Django에서 정한 경로 형식이 저장되어 있는데 이를 오버라이딩하여 커스텀 할 수 있다.
forms.py
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
또한 비밀번호를 변경하면 기존 세션 정보와 일치하지 않아 로그아웃이 되기 때문에 로그인이 유지되도록 update_session_auth_hash
를 사용해 구현한다.
views.py(완성본)
from django.contrib.auth.forms import PasswordChangeForm
@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)