Django 암호 수정 구현하기

2022. 2. 8. 16:12강의 정리/Django 기초

반응형

출처 : https://www.inflearn.com/course/%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%A5%EA%B3%A0-%EC%9B%B9%EC%84%9C%EB%B9%84%EC%8A%A4/dashboard

 

장고(Django)를 배우기 시작한 입문자이시거나, 또는 배우고 싶은 생각이 있으신 분은 위 출처의 강의를 적극 추천드립니다!!!

 


 

auth 앱의 PasswordChangeForm 을 활용하여 암호 수정 구현

 

https://github.com/django/django/blob/main/django/contrib/auth/views.py

class PasswordChangeView(PasswordContextMixin, FormView):
    form_class = PasswordChangeForm
    success_url = reverse_lazy("password_change_done")
    template_name = "registration/password_change_form.html"
    title = _("Password change")

    @method_decorator(sensitive_post_parameters())
    @method_decorator(csrf_protect)
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

    def get_form_kwargs(self):
        kwargs = super().get_form_kwargs()
        kwargs["user"] = self.request.user
        return kwargs

    def form_valid(self, form):
        form.save()
        # Updating the password logs out all other sessions for the user
        # except the current one.
        update_session_auth_hash(self.request, form.user)
        return super().form_valid(form)


class PasswordChangeDoneView(PasswordContextMixin, TemplateView):
    template_name = "registration/password_change_done.html"
    title = _("Password change successful")

    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

 

 


 

 

#accounts/urls.py

urlpatterns = [

    path("password_change/", views.password_change, name="password_change"),
        
    ]

 

 

#accounts/views.py

from django.contrib.auth.views import LoginView, LogoutView, logout_then_login, PasswordChangeView as AuthPasswordChangeView
from django.contrib.auth.mixins import LoginRequiredMixin
from django.urls import reverse_lazy



class PasswordChangeView(LoginRequiredMixin, AuthPasswordChangeView):
    # reverse_lazy는 CBV에서 사용하는 reverse 함수이다.
    success_url = reverse_lazy("password_change")
    template_name = 'accounts/password_change_form.html'
    form_class = PasswordChangeForm

    # CBV에서도 form 객체를 사용할 수 있다.
    # form_valid 하다면 아래 함수가 실행된다.
    def form_valid(self, form):
        messages.success(self.request, "암호를 성공적으로 변경했습니다!")
        return super().form_valid(form)


password_change = PasswordChangeView.as_view()

 

 

#accounts/forms.py

class PasswordChangeForm(AuthPasswordChangeForm):
    def clean_new_password2(self):
        # 기존 암호
        old_password = self.cleaned_data.get('old_password2')
        
        # 새로운 암호
        new_password2 = super().clean_new_password2()
        
        # 만약 기존 암호와 새로운 암호가 같다면
        if old_password == new_password2:
            raise forms.ValidationError("변경할 암호가 기존 암호와 달라야 합니다")
        
        return new_password2

 

  • 위 코드는 현재 암호와 새로운 암호가 같은 경우에도 변경이 되는 것을 방지하기 위함입니다.

 

 

#accounts/templates/accounts/password_change_form.html

{% extends "accounts/layout.html" %}
{% load bootstrap4 %}

{% block content %}
    <div class="container">
        <div class="row">
            <div class="col-sm-6 offset-sm-3">
                {% include "_form.html" with form_title="암호 변경" submit_label="암호 변경"  %}
            </div>
        </div>
    </div>  
{% endblock %}

 

 

 

 

#만약 위 Password에 오류가 나게 하고 싶다면 아래와 같은 코드를 작성해야합니다.

#accounts/forms.py

class PasswordChangeForm(AuthPasswordChangeForm):
    def clean_new_password1(self):
        # 기존 암호
        old_password = self.cleaned_data.get('old_password')
        
        # 새로운 암호
        new_password1 = self.cleaned_data.get('new_password1')
        
        # 만약 기존 암호와 새로운 암호가 같다면
        if old_password and new_password1:    
            if old_password == new_password1:
                raise forms.ValidationError("변경할 암호가 기존 암호와 달라야 합니다")
        
        return new_password1

 

반응형