작성
·
40
0
강의에서 나오는 forms.py 파일을 만들어서 커스텀폼을 만드니
A user with that username already exists.
username 이 이미 존재하는 에러가 계속해서 발생 (다른 수강생분들도 겪은 에러인듯)
장고 기능이 추가된 건지는 몰라도 PasswordChangeView 를 활용함
class AccountUpdateView(PasswordChangeView):
form_class = PasswordChangeForm
template_name = 'accountapp/update.html'
success_url = reverse_lazy('accountapp:detail')
여기서 success_url 이 정적 url 로 pk 파라미터 값을 전달해주지 못하는 문제가 있음
그래서 수정된 코드는
class AccountUpdateView(PasswordChangeView):
form_class = PasswordChangeForm
template_name = 'accountapp/update.html'
def get_success_url(self):
return reverse('accountapp:detail', kwargs={'pk': self.request.user.pk})
2025년 3월 31일 기준
1) 비밀번호 변경 기능의 기본 View,Form 있음 (PasswordChangeView, PasswordChangeForm)
2) 비밀번호 변경 후 hello_world 페이지로 리다이렉트 시킬거면 success_url = 'accountapp:hello_world'
3) 로그인한 계정의 detail 페이지로 이동한다면 마지막 코드 참고
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 유정렬님!
질문해주신 내용에 대해서 살펴보겠습니다. Django에서 비밀번호 변경 후의 리다이렉트 문제와 관련하여, PasswordChangeView
를 사용하고 계신 것 같습니다. 이 경우 비밀번호 변경 성공 시 사용자 프로필 페이지로 이동하도록 수정하셨는데요.
기본적으로 PasswordChangeView
를 사용하게 되면, 성공 시 리다이렉트할 URL을 지정하는 success_url
속성을 통해 설정할 수 있습니다. 하지만 pk와 같은 특정한 매개변수가 필요한 경우 get_success_url
메서드를 오버라이딩함으로써 동적으로 URL을 생성할 수 있습니다.
주신 코드에서 문제를 해결하기 위한 방법은 get_success_url
메서드를 사용하여, 현재 사용자의 pk를 이용해 detail 페이지로 리다이렉트하는 것입니다. 아래의 코드대로 설정하시면, 비밀번호 변경 후 로그인한 사용자의 프로필 상세 페이지로의 리다이렉트가 가능해집니다.
class AccountUpdateView(PasswordChangeView):
form_class = PasswordChangeForm
template_name = 'accountapp/update.html'
def get_success_url(self):
return reverse('accountapp:detail', kwargs={'pk': self.request.user.pk})
이 방식은 사용자가 로그인된 상태를 가정하고 있으며, 로그인된 사용자의 pk를 직접 가져와 활용하기에 대부분의 사용자 시나리오에서 잘 작동할 것입니다.
첨부해주신 문제와 관련하여 더 깊이 이해하고 싶으시다면 이전의 유사한 질문 답변을 확인해보시는 것도 좋습니다:
- Password change example: View and URL
- Django password change view clarification
앞으로도 비밀번호 변경 및 파라미터 처리가 필요한 부분에서 더 많은 유사한 케이스를 살펴보며 응용할 수 있게 되실 겁니다. 추가적인 궁금한 점이 있으시면 언제든지 질문해 주세요!
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.