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

 

 

 

 

 

 

 

 

 

 

 

반응형