Django 암호 수정 구현하기
2022. 2. 8. 16:12ㆍ강의 정리/Django 기초
반응형
장고(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
반응형
'강의 정리 > Django 기초' 카테고리의 다른 글
Django 인스타그램 Timeline sidebar 구현하기 (0) | 2022.02.17 |
---|---|
Django 포스팅 쓰기 구현하기 (0) | 2022.02.14 |
Django 유저 프로필 수정 (0) | 2022.02.08 |
Django 프로필 디폴트 이미지 구현하기 (0) | 2022.02.07 |
Django 로그인, 로그아웃 구현하기 (0) | 2022.02.07 |