The Boxer

[Django] 계정정보 수정, 비밀번호 변경 본문

Django

[Django] 계정정보 수정, 비밀번호 변경

Prower 2019. 4. 18. 18:02
728x90
반응형

django가 기본적으로 제공하는 계정정보 수정 form 클래스비밀번호 변경 form 클래스를 사용하여 기능 구현

 

I. 계정정보 수정

- django가 제공하는 UserChangeForm을 사용하여 계정정보 변경

 

계정정보 변경 과정

  1. 사용자에게 계정 수정 form 태그 제공
  2. 사용자가 작성한 정보를 사용하여 User를 저장할 form객체 생성
  3. 유효성을 검사한 후 User 정보 수정

 

(1) UserChangeForm

- django가 제공하는 User정보 변경 form객체

- 변경할 대상(User객체)을 instance인자로 넘겨 form태그 생성

변경할 대상(User객체)을 instance인자로 넘기고, 사용자가 작성한 정보를 data인자로 넘겨 저장할 User객체를 생성

 

instance, data

  • User form클래스에서 사용되는 인자
  • instance: 변경할 대상(User객체)를 담는 인자
  • data: 변경할 정보를 담는 인자

 

구현 예시

def update(request):
    if request.method == "POST":
    	# updating
        user_change_form = UserChangeForm(data=request.POST, instance=request.user)
        
        if user_change_form.is_valid() and profile_form.is_valid():
            user = user_change_form.save()
        
    else:
        # editting
        user_change_form = UserChangeForm(instance=request.user)

        context = {
            'user_change_form': user_change_form,
        }
        
        return render(request, 'update.html', context)

 

문제점

UserChangeForm을 그대로 제공할 경우, 불필요한 정보(비밀번호 암호화 방식 등)또한 제공됨

따라서, 정보를 선별하여 사용자에게 제공해주어야 하며, UserChangeForm을 상속받아 새로운 form class를 통해 이를 구현

 

(2) 새로운 UserChangeForm 생성

- forms.py에서 UserChangeForm을 상속받아 새로운 form class생성

- 사용자에게 필요한 정보만 수정할 수 있도록 제공

 

구현 예시

class CustomUserChangeForm(UserChangeForm):
    class Meta:
        model = get_user_model()
        fields = ['username', 'email', 'first_name', 'last_name']

 

 

II. 비밀번호 변경

- 계정정보 변경과 마찬가지로 django가 제공하는 PasswordChangeForm을 사용해 비밀번보 변경 기능 구현

 

(1) PasswordChangeForm

- 변경할 대상(User객체)을 instance인자로 넘겨 form 객체 생성

- 변경할 대상(User객체)을 instance인자로, 사용자가 작성한 비밀번호 정보를 data인자로 넘겨 저장할 User객체 생성

 

구현 예시

def password(request):
    if request.method == "POST":
        password_change_form = PasswordChangeForm(request.user, request.POST)
        
        if password_change_form.is_valid():
            user = password_change_form.save()
            update_session_auth_hash(request, user)
        
    else:
        password_change_form = PasswordChangeForm(request.user)
        context = {
            'password_change_form': password_change_form
        }
        
        return render(request, 'password.html', context)

 

(3) django의 세션관리

- django는 password가 포함된 유저에 관한 여러 값을 hash function통과시키고, 이 hash 값을 세션에 저장한다.

- 따라서 password가 변경된 경우, 로그인된 유저의 hash값이 서버의 hash값과 다르게 되고, 서버는 로그인해 있는 유저를 로그아웃시킨다.

- 이를 해결하기위해 password가 변경될 경우, 서버에 있는 hash값도 변경시켜 주어야 한다.

 

728x90
반응형

'Django' 카테고리의 다른 글

[Django] M : N Relation 구현  (0) 2019.04.12
[Django] 계정 생성, 로그인, 로그아웃  (0) 2019.04.12
[Django] Image Upload  (0) 2019.04.11
[Django] Model Form  (0) 2019.04.10
Comments