PasswordChangeForm Issue about label_suffix

종욱·2020년 3월 2일
0

django

목록 보기
3/5
post-thumbnail

PasswordChangeView 에서 label의 콜론 지우기


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

0개의 댓글