-
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