ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Django 회원기능 구현하기
    Django 2024. 8. 18. 21:32

    회원가입

     

    Django는 기본 auth.User를 가지고 있기 때문에, 이를 기반으로한 기본적인 회원가입 ModelForm을 제공하고 있다.

     

    UserCreationForm

    • Django는 OpenSource이다
    • username과 password 로 새로운 user를 생성하는 ModelForm
    • username, password1, password2를 가진다.
    •  

     

    코드 작성하기

     

    (signup) accounts/forms.py

    from django import forms
    
    
    class ArticleForm(forms.Form):
        title = forms.CharField(max_length=10)
        content = forms.CharField()

     

    (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)

     

    (signup) accounts/templates/accounts/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 %}

     

    (signup) base.html

    <a href="{% url 'accounts:signup' %}">회원가입</a>

     

    (session) accounts/views.py

    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)

     

     

    실행해보면

    잘 넘어가고

    vs code, SQL에서도 일반유저로 아이디가 잘 만들어진 걸 확인할 수 있다.

     

     

    회원가입하는 순간 바로 로그인까지 되게 수정해보자.

     

    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)

     

    실행해보면, 물론 영상이 아니라 확인이 안되지만 회원가입하자마자 바로 로그인된다. 

    새로 SQL에도 새 회원아이디 aiden이 생김

     


     

    회원 탈퇴

     

    회원정보 지우는거니까 delete로

     

    (delete) accounts/urls.py

    from django.urls import path
    from . import views
    
    app_name = "accounts"
    urlpatterns = [
        path("login/", views.login, name="login"),
        path("logout/", views.logout, name="logout"),
        path("signup/", views.signup, name="signup"),
        path("delete/", views.delete, name="delete"),
    ]

     

     

    만약, 탈퇴하면서 해당 유저의 세션도 같이 지워주려면, 어스_로그아웃을 넣어주면 된다. (로그아웃되면 세션정보도 같이 삭제되니까)

     

    (delete) accounts/views.py

    @require_POST
    def delete(request):
        if request.user.is_authenticated:
            request.user.delete()
            auth_logout(request)
        return redirect("index")

    ★ 탈퇴하고 → 세션지우고. 이 순서 바뀌면 안됨!

     

     

    그리고 base.html에서 회원 탈퇴 버튼 추가

     

    (delete) base.html

    <form action="{% url "accounts:delete" %}" method="POST">
        {% csrf_token %}
        <input type="submit" value="회원탈퇴"></input>
    </form>

     

     

    실행해보면 회원탈퇴 버튼이 생겼고, 버튼을 누르면

    바로 로그아웃까지 되고 

     

    SQL에서도 사라졌다.

     

     

    그런데 로그인 상태에서도 회원가입이 보이니까 좀 이상해서 

     

    base.html 에서 이 부분 코드를 수정했다.

            {% else %}
                <a href="{% url 'accounts:login'%}">로그인</a>
                <a href="{% url 'accounts:signup' %}">회원가입</a>
            {% endif %}

     

     

    이제 로그인 상태일 때는 상단에 회원가입 텍스트가 안보인다.😊

     


     

    회원 정보 수정

     

    이것도 마찬가지로 장고에서 수정 ModelForm 을 제공해준다.

     

    CustomUserChangeForm

     

    수정하는거니까 update로 해서 구현해보자.

     

    (update) 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/urls.py

    from django.urls import path
    from . import views
    
    app_name = "accounts"
    urlpatterns = [
    		...
        path("update/", views.update, name="update"),
    ]

     

     

    (update) acounts/views.py

     

    from django.shortcuts import render, redirect
    from django.contrib.auth.forms import (
        AuthenticationForm, 
        UserCreationForm,
    )
    from django.contrib.auth import login as auth_login
    from django.contrib.auth import logout as auth_logout
    from django.views.decorators.http import require_POST, 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)

     

     

    accounts/templates/accounts/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 %}

     

     

    회원정보 수정 버튼 (update) base.html

    <a href="{% url "accounts:update" %}">회원정보수정</a>

     

     

    휴..

    서버 실행해보면 

    coco11 에서 aiden 으로 회원정보가 잘 수정되었다.

     


     

    비밀번호 수정하기

     

     

    PasswordChangeForm

     

    (password) urls.py

    from django.urls import path
    from . import views
    
    app_name = "accounts"
    urlpatterns = [
        ...
        path("password/", views.change_password, name="change_password"),
    ]

     

    (password) views (비밀번호가 변경되어도 로그아웃되지 않고, 기존의 세션 인증정보도 같이 변경되도록)

    @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 %}

     

    (password) forms.py → CustomUserChangeForm

    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

     

     


     

     

    근데.. 서버 실행했더니 오류가 계속 떠서... 왜그런가 했더니..

     

    urls.py네이밍password 로 해서 그런거였다.

    path("password/", views.change_password, name="password")

     

    url로 넘어가는 코드를 모두 'change_password' 에서  → 'password' 로 네이밍 해준대로 바꿔줬더니 해결됐다. 

    앞으로 통일해주기로...

     

    회원기능 구현하기 끝.. ㅎㅎ🫠

     

     

     

    'Django' 카테고리의 다른 글

    Django 관리자 페이지 (Admin Site)  (0) 2024.08.19
    Django Static & Media  (0) 2024.08.19
    Django Auth, Login & Logout  (4) 2024.08.17
    Django Form Class  (0) 2024.08.17
    Django Model, Migration, ORM, Database API  (0) 2024.08.16
Designed by Tistory.