1)
@login_required
def password_change(request):
class PasswordChangeView(LoginRequiredMixin, AuthPasswordChangeView):
pass
password_change = PasswordChangeView.as_view()
urls.py에 as_view로 바로 정의해줄 수 있었지만, 커스터마이징을 위해 views.py까지 넘어왔다.
@login_required 장식자를 사용한 함수뷰를 만드는 대신 LoginRequiredMixin과 PasswordChangeView를 모두 상속하는 클래스뷰의 인스턴스 함수를 생성하는 방법을 택했다.
2)
class PasswordChangeView(PasswordContextMixin, FormView):
form_class = PasswordChangeForm
success_url = reverse_lazy("password_change_done")
template_name = "registration/password_change_form.html"
title = _("Password change")
깃헙에서는 클래스에 정의될 수 있는 요소들을 확인할 수 있다.
3)
class PasswordChangeForm(AuthPasswordChangeForm):
def clean_new_password2(self)
old_password = self.cleaned_data.get('old_password')
new_password2 = super().clean_new_password2()
if old_password == new_password2:
raise forms.ValidationError("새로운 암호와 기존 암호가 달라야 합니다.")
return new_password2
암호 변경 시 기존 암호와 새 암호가 다르게 설정을 하고 싶다. 상속한 클래스에 이미 clean_new_password2가 있음을 알고 있어서 여기서 반환된 값을 적극적으로 사용했다.
new_password1을 위한 부모 클래스의 해당 함수는 없었다.