"회원관리 3-1. 회원정보 수정"의 두 판 사이의 차이

(새 문서: ==유저 정보 수정== ===url만들기=== 다음 url 추가.<syntaxhighlight lang="python3"> path('update/', views.update, name='update'), </syntaxhighlight> ===Form 추가=== 장...)
 
 
(같은 사용자의 중간 판 하나는 보이지 않습니다)
5번째 줄: 5번째 줄:
 
path('update/', views.update, name='update'),
 
path('update/', views.update, name='update'),
 
</syntaxhighlight>
 
</syntaxhighlight>
===Form 추가===
+
 
장고에서 제공하는 UserChangeForm을 상속할 필요는 없다. 기본 폼이 난 맘에 안들어.<syntaxhighlight lang="python3">
+
= 장고 제공 폼 사용 =
class UserUpdateForm(forms.ModelForm):
+
가장 간편한 방법이다.
 +
 
 +
=== form 추가 ===
 +
<syntaxhighlight lang="python3">
 +
from django.contrib.auth.forms import UserChangeForm  # 제공하는 폼이 있다.
 +
from django.contrib.auth import get_user_model  # 장고에 커스텀으로 등록한 모델을 불러온다.
 +
 
 +
class User_update_form(UserChangeForm):
 
     class Meta:
 
     class Meta:
         model = get_user_model()
+
         model = get_user_model() #  설정된 커스텀모델
         fields = ['username', 'email', 'nickname']
+
         fields = ["nickname", "email"]  # password1,2 필드는 자동추가된다.
 
</syntaxhighlight>
 
</syntaxhighlight>
===view 추가===
+
 
 +
=== view 추가 ===
 
<syntaxhighlight lang="python3">
 
<syntaxhighlight lang="python3">
 
from .forms import UserUpdateForm
 
from .forms import UserUpdateForm
40번째 줄: 48번째 줄:
 
     return render(request, 'user_update.html', {'form': form})
 
     return render(request, 'user_update.html', {'form': form})
 
</syntaxhighlight>
 
</syntaxhighlight>
==비밀번호 수정, 비밀번호 바꾸기==
+
=커스텀 폼을 사용하는 경우=
 +
사실, 유저객체를 얻고 비밀번호만 바꿀거라면 다음의 코드로 간단하게 변경된다.
 +
 
 +
<code>user.set_password(password)</code>
 +
 
 +
그래도 폼을 사용해 보겠다면 아래와 같이 사용이 가능하겠다.
 +
 
 +
===Form 추가===
 +
장고에서 제공하는 UserChangeForm을 상속할 필요는 없다. 기본 폼이 난 맘에 안들어.<syntaxhighlight lang="python3">
 +
class UserUpdateForm(forms.ModelForm):
 +
    class Meta:
 +
        model = get_user_model()
 +
        fields = ['username', 'email', 'nickname']
 +
</syntaxhighlight>
 +
===비밀번호 수정, 비밀번호 바꾸기===
 +
커스텀 폼의 경우 패스워드에 대해 따로 처리해주어야 한다.
 +
 
 
===url 추가===
 
===url 추가===
 
<code>path('password/', views.password, name='password'),</code>
 
<code>path('password/', views.password, name='password'),</code>
===form 추가===
 
폼은 제공해주는 걸 가져다 쓴다.
 
 
===view 추가===
 
===view 추가===
<syntaxhighlight lang="python3">
+
폼을 건들 필요 없이, 뷰에서 바로 제공하는 폼을 사용하면 된다.(키 이름은 password1, 2 이니, 탬플릿에선 적당히 고쳐 사용할 것.)<syntaxhighlight lang="python3">
 
from django.contrib.auth.forms import PasswordChangeForm
 
from django.contrib.auth.forms import PasswordChangeForm
 
from django.contrib.auth import update_session_auth_hash
 
from django.contrib.auth import update_session_auth_hash
64번째 줄: 86번째 줄:
 
     return render(request, 'user_update_password.html',{'form':form})
 
     return render(request, 'user_update_password.html',{'form':form})
 
</syntaxhighlight>
 
</syntaxhighlight>
===template에 추가===
+
 
 
[[분류:장고 기능구현(초급)]]
 
[[분류:장고 기능구현(초급)]]

2022년 12월 15일 (목) 09:45 기준 최신판

1 유저 정보 수정편집

1.1 url만들기편집

다음 url 추가.

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

2 장고 제공 폼 사용편집

가장 간편한 방법이다.

2.1 form 추가편집

from django.contrib.auth.forms import UserChangeForm  # 제공하는 폼이 있다.
from django.contrib.auth import get_user_model  # 장고에 커스텀으로 등록한 모델을 불러온다.

class User_update_form(UserChangeForm):
    class Meta:
        model = get_user_model()  #  설정된 커스텀모델
        fields = ["nickname", "email"]  # password1,2 필드는 자동추가된다.

2.2 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})

2.3 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})

3 커스텀 폼을 사용하는 경우편집

사실, 유저객체를 얻고 비밀번호만 바꿀거라면 다음의 코드로 간단하게 변경된다.

user.set_password(password)

그래도 폼을 사용해 보겠다면 아래와 같이 사용이 가능하겠다.

3.1 Form 추가편집

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

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

3.2 비밀번호 수정, 비밀번호 바꾸기편집

커스텀 폼의 경우 패스워드에 대해 따로 처리해주어야 한다.

3.3 url 추가편집

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

3.4 view 추가편집

폼을 건들 필요 없이, 뷰에서 바로 제공하는 폼을 사용하면 된다.(키 이름은 password1, 2 이니, 탬플릿에선 적당히 고쳐 사용할 것.)

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