TIL 240411

hyeo71·2024년 4월 11일
0

2024 내배캠 AI 트랙

목록 보기
72/108

Django 회원기능

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을 사용

회원탈퇴

  • views.py
    @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)

0개의 댓글