해결된 질문
작성
·
275
1
안녕하세요 강사님,
PasswordChangeForm 을 재정의 하는 부분에서 질문이 있어 글 남깁니다.
1. PasswordChangeForm은 SetPasswordForm을 상속받기 때문에 clean_new_password2를 오버라이딩하여 해당 함수가 기존 대로 실행 될때 단순히 old_password와 같은지 비교하는 로직을 추가한게 맞나요?
2. clean_new_password2를 오버라이딩 할 때, super().clean_new_password2()를 하지 않고 self.cleaned_data.get('new_password2')를 하게 기존의 pw1==pw2 확인하는 로직이 사라져 버리기 때문에 문제가 생기는 것이 맞나요? (실험결과 new_pw1, new_pw2 를 다르게 넣으면 new_pw1 으로 변경이 됩니다). 즉 super()... 를 적어줘야 기존 로직을 지킬 수 있는 것이죠?
3. clean_new_password1은 새로운 함수를 정의한 것인데 clean_ 이 앞에 붙었기 때문에 PasswordChangeForm의 로직이 동작할 때 무조건 해당 함수가 실행이 되는 것이 맞나요? 이 함수가 실행되는 시점이 궁금합니다.
감사합니다.
답변 1
2
안녕하세요.
1. 그렇습니다. // PasswordChangeForm은 SetPasswordForm을 상속받은 상태이죠. SetPasswordForm은 SetPasswordForm에서 정의한 필드들에 대한 유효성 검사의 책임이 있으며, PasswordChangeForm은 SetPasswordForm에 정의된 필드들에 대한 유효성 검사에 대해서는 책임을 질 필요가 없습니다. PasswordChangeForm은 PasswordChangeForm에서 정의한 필드들에 대해서만 유효성 검사를 수행하는 거죠.
2. 그렇습니다. // 부모 클래스에서 정의한 메서드를 자식 클래스에서 재정의할 때에는, 부모의 로직을 그대로 지키면서 자식의 로직을 이어갈 수도 있고, 부모의 로직을 무시하고 자식의 로직만 수행할 수도 있습니다. 이 경우에는 부모의 로직을 그대로 지키면서 자식의 로직을 이어갈려는 것이기에 부모의 clean_new_password2를 호출해준 것입니다.
3. 장고 Form에서는 유효성 검사 시에 clean_필드명 메서드가 있다면, 호출해줍니다. 관련 장고 코드는 아래에서 확인하실 수 있습니다. 차근차근 호출순서를 따라가보시며 호출시점을 확인하실 수 있습니다.
https://github.com/django/django/blob/4.0.6/django/forms/forms.py#L447
유효성 검사 실행 시점에 대해서는 <Form Validation> 에피소드에서 자세하게 다룬 바 있으니 다시 참고해보시면 좋을 듯 합니다.
화이팅입니다. :-)
ps. 질문이 해결되셨다면, 본 질문의 상태를 해결됨으로 변경 부탁드립니다.