회원관리 3-1. 회원정보 수정

Pywiki
Sam (토론 | 기여)님의 2021년 6월 21일 (월) 14:08 판 (새 문서: ==유저 정보 수정== ===url만들기=== 다음 url 추가.<syntaxhighlight lang="python3"> path('update/', views.update, name='update'), </syntaxhighlight> ===Form 추가=== 장...)
(차이) ← 이전 판 | 최신판 (차이) | 다음 판 → (차이)
둘러보기로 가기 검색하러 가기

1 유저 정보 수정

1.1 url만들기

다음 url 추가.

path('update/', views.update, name='update'),

1.2 Form 추가

장고에서 제공하는 UserChangeForm을 상속할 필요는 없다. 기본 폼이 난 맘에 안들어.

class UserUpdateForm(forms.ModelForm):
    class Meta:
        model = get_user_model()
        fields = ['username', 'email', 'nickname']

1.3 view 추가

from .forms import UserUpdateForm
def update(request):
    if request.method == "POST":
        form = UserUpdateForm(request.POST, instance=request.user)  # 이게 없으면 수정할 때마다 새로운 계정을 만든다.
        if form.is_valid():
            form.save()  # 폼값을 불러오고 저장
            return redirect('membership:profile')
    else:
        form = UserUpdateForm(instance=request.user)
    return render(request, 'user_update.html', {'form': form})

1.4 template 추가

회원정보 수정에서 쓰이는 탬플릿은 회원가입에서도 쓰일 수 있으니... 따로 만들어두어 양쪽에서 함께 사용할 수 있게 배치하면 좋겠다.

from .forms import UserUpdateForm
def update(request):
    if request.method == "POST":
        form = UserUpdateForm(request.POST, instance=request.user)  # 이게 없으면 수정할 때마다 새로운 계정을 만든다.
        if form.is_valid():
            print(request.POST['nickname'])
            print(request.POST['email'])
            form.save()  # 폼값을 불러오고 저장
            return redirect('membership:profile')
    else:
        form = UserUpdateForm(instance=request.user)
    return render(request, 'user_update.html', {'form': form})

2 비밀번호 수정, 비밀번호 바꾸기

2.1 url 추가

path('password/', views.password, name='password'),

2.2 form 추가

폼은 제공해주는 걸 가져다 쓴다.

2.3 view 추가

from django.contrib.auth.forms import PasswordChangeForm
from django.contrib.auth import update_session_auth_hash

@login_required
def password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(user=request.user, data=request.POST)
        if form.is_valid():
            user = form.save()
            # 비밀번호를 바꾸면 기존 세션과 일치하지 않게 되어 로그아웃된다. 이를 방지하기 위한 auth_hash 갱신.
            update_session_auth_hash(request, user)  
            return redirect('membership:profile')
    
    else:
        form = PasswordChangeForm(request.user)
    return render(request, 'user_update_password.html',{'form':form})

2.4 template에 추가