PasswordChangeView를 상속받은 CBV에서,
get 호출로 렌더링하는 템플릿에 쓰는 form 의 레이블 뒤에 :
표시를 지우고 싶은 상황이었다.
django.contrib.auth.view 의 PasswordChangeView 는 내부적으로 갖는 form_class가 PasswordChangeForm 이다.
아래 방법으로 form 의 값을 변경해주고 싶었다.
from django.contrib.auth import views as auth_views
class PasswordChangeView(auth_views.PasswordChangeView):
template_name = 'accounts/password_change_form.html'
success_url = reverse_lazy('home')
def form_valid(self, form):
if not form.user.is_changed_pw:
form.user.is_changed_pw = True
form.user.save()
messages.success(self.request, '비밀번호 변경 성공.')
return super().form_valid(form)
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['label_suffix'] = ''
return kwargs
디버깅 해보면 form의 label_suffix 는 빈 문자열로 의도대로 설정됐지만,
템플릿의 실제로 필드의 label_tag를 출력하면 콜론이 붙어있다.
한참을 고민하다가 django github 코드를 보고 해결했다.
문제의 이유는 form의 fields['old_password'].label
의 값에 콜론이 있기때문.
그래서 get_form_kwargs 함수를 지우고 아래와 같이 get_form 함수를 추가했다.
# ...
def get_form(self):
form = super().get_form()
form.label_suffix = ''
form.fields['old_password'].label = '기존 비밀번호'
form.fields['new_password1'].label = '새 비밀번호'
form.fields['new_password2'].label = '새 비밀번호 (확인)'
return form