카테고리 없음

[Django] 로그아웃, 회원정보수정, 비밀번호 수정 만들기

황성안 2021. 3. 23. 22:06
728x90
반응형

시작하기

가상환경 설정을 위한 세팅을 하여줍니다.

python -m venv venv && source vnev/Scripts/activate
pip install -r reqirements.txt

 

설정하기

accounts 만들기

python manage.py startapp accounts

그리고 서버가 켜지는지 확인해봅시다!

python manage.py runserver

settings.py 에 INSTALL_APP 에 'accounts', 를 추가해줍시다! (모르신다면 저번 게시물로!)

startproject에 urls.py 안 accounts path를 추가시켜 줍시다.

 

account-기능 구현

이는 이전 articles (startapp)을 만들때와 비슷하게 해주시면 됩니다.

저의 순서는 urls.py > views.py > html만들기 순으로 진행하겠습니다.

회원가입만들기(signup)

urls.py

from django.urls import path
from . import views

app_name='accounts'
urlpatterns = [
    path('signup/', views.signup, name='signup'),
]

views.py

from django.shortcuts import render
from django.contrib.auth.forms import (
    UserCreationForm,
    UserChangeForm,

)


# Create your views here.
def signup(request):
    form = UserCreationForm()
    context = {
        'form':form,
    }
    return render(request, 'accounts/signup.html', context)

 

signup.html

{% extends 'base.html' %}

{% block content %}
<form action="" method="POST">
 {% csrf_token %}
 {{ form }}
 <button>회원가입</button>
</form>
{% endblock  %}

git log 남기기

git status

git add .

git commit -m "Add signup feature"

 

로그인, 로그아웃(login, logout)

urls.py

from django.urls import path
from . import views

app_name='accounts'
urlpatterns = [
    path('signup/', views.signup, name='signup'),
    path('login/', views.login, name='login'),
    path('logout/', views.logout, name='logout'),
]

views.py

from django.shortcuts import render, redirect
from django.contrib.auth import login as auth_login
from django.contrib.auth import logout as auth_logout


# Create your views here.
def signup(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
           user = form.save()
           auth_login(request, user) # 로그인 == 세션 생성
           # 회원가입 축하 메세지를 
           #request에 담아서 같이 보냅니다.
           messages.add_message(
               request, messages.SUCCESS, '회원가입을 축하합니다!'
               )
           return redirect('articles:index')
    else:
        form = UserCreationForm()
    context = {
        'form':form,
    }
    return render(request, 'accounts/signup.html', context)

def login(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, request.POST)
        if form.is_valid():
            # 세션 생성
            # 1. DB에 세션을 생성
            # 2. request 객체에 session 정보가 생성
            #   => request.session 사용 가능
            auth_login(request, form.get_user())
            return redirect('articles:index')
    else:
        form = AuthenticationForm()
    context = {
        'form':form,
    }
    return render(request, 'accounts/login.html', context)


def logout(request):
    auth_logout(request)
    # 세션 삭제
    # 1. DB에 있는 세션 삭제
    # 2. request 객체에 담긴 session 삭제
    return redirect('articles:index')
from django.contrib.auth import logout as auth_logout
def logout(reqeust:)
    auth_logout(request)
    # 세션 삭제
    # 1. DB에 있는 세션 삭제
    # 2. request 객체에 담긴 session 삭제
    return redirect('articles:index')

login.html

{% extends 'base.html' %}

{% block content %}
<form action="" method="POST">
 {% csrf_token %}
 {{ form }}
 <button>회원가입</button>
</form>
{% endblock  %}

logout.html(없음 ㅎ)

 

 

정보수정(업데이트)

urls.py


views.py

from django.shortcuts import render, redirect
from django.contrib.auth.forms import (
    UserCreationForm,
    UserChangeForm,
    AuthenticationForm,
    PasswordChangeForm,
)
from django.contrib.auth import login as auth_login
from django.contrib.auth import logout as auth_logout
from .forms import CustomUserChangeForm


# Create your views here.
def signup(request):
    if request.method == 'POST':
        form = UserCreationForm(request.POST)
        if form.is_valid():
           user = form.save()
           auth_login(request, user) # 로그인 == 세션 생성
           # 회원가입 축하 메세지를 
           #request에 담아서 같이 보냅니다.
           messages.add_message(
               request, messages.SUCCESS, '회원가입을 축하합니다!'
               )
           return redirect('articles:index')
    else:
        form = UserCreationForm()
    context = {
        'form':form,
    }
    return render(request, 'accounts/signup.html', context)

def login(request):
    if request.method == 'POST':
        form = AuthenticationForm(request, request.POST)
        if form.is_valid():
            # 세션 생성
            # 1. DB에 세션을 생성
            # 2. request 객체에 session 정보가 생성
            #   => request.session 사용 가능
            auth_login(request, form.get_user())
            return redirect('articles:index')
    else:
        form = AuthenticationForm()
    context = {
        'form':form,
    }
    return render(request, 'accounts/login.html', context)


def logout(request):
    auth_logout(request)
    # 세션 삭제
    # 1. DB에 있는 세션 삭제
    # 2. request 객체에 담긴 session 삭제
    return redirect('articles:index')


def update(request):
    if request.method == 'POST':
        form = CustomUserChangeForm(request.POST, instance=request.user)
        if form.is_valid():
            form.save()
            return redirect('articles:index')
    else:
        form = CustomUserChangeForm(instance=request.user)
    context = {
        'form':form,
    }
    return render(request, 'accounts/update.html', context)

update.html

{% extends 'base.html' %}

{% block content %}
<form action="" method="POST">
 {% csrf_token %}
 {{ form }}
 <button>회원정보수정</button>
</form>
{% endblock  %}

 

forms.py 만들기 (accounts)

from django import forms
from .models import Article


class ArticleForm(forms.ModelForm):

    class Meta:
        model = Article
        fields = '__all__'
        # exclude = ('title',)
        


: 추가로 아래 패스워드 머시기 없앨때 아래 코드

아티크폼과 메타 사이에 적어주시면됩니다.

password = None 

 

 

비밀번호 수정

위 과정은 전부 비슷하다

다만 form에 PasswordChangeForm 이 들어간다.

https://docs.djangoproject.com/en/3.1/topics/auth/default/#django.contrib.auth.update_session_auth_hash

여기를 참고해주자

views.py

def password_update(request):
    from django.contrib.auth import update_session_auth_hash
    if request.method == 'POST':
        form = PasswordChangeForm(
            user=request.user, data=request.POST
            )
        if form.is_valid():
            form.save()#비밀번호 변경
            update_session_auth_hash(request, form.user)
            return redirect('articles:index')
    else:
        form = PasswordChangeForm(request.user)
    context = {
        'form':form,
    }
    return render(request, 'accounts/password_update.html', context)

 

 

 

https://d2.naver.com/helloworld/318732

728x90
반응형