[Django] Custom User 사용시 SignUp에서 에러나는 경우(CBV - swapped Error)

반응형

django Logo

 

 
Contents

    1. 배경

    장고에서 User역할을 하는 app을 따로 생성한 뒤, SignUp을 CreateView를 상속받아 사용할 수 있습니다. 이때, form_class로 UserCreationForm을 이용하면 아래와 같은 [Manager isn't available; 'auth.User' has been swapped for 'accounts.User'] 에러가 발생합니다. 원인과 이를 해결하는 방법을 알아보겠습니다.

    오류 화면

     

    2. 해결

    1) 원인

    저는 User를 accounts라는 app으로 새로 만들었습니다. settings.py에 AUTH_USER_MODEL = "accounts.User" 도 잘 추가해 줬습니다. 그런데 SignUpVIew에서 form_class로 사용하는 UserCreationForm은 기본적으로 django의 default user를 참조합니다. 그렇기 때문에, 우리가 생성한 User로 Form을 새로 만들어야 해결됩니다.

     

    2) forms.py

    Custom User 앱(저는 accounts)에서 forms.py를 생성합니다. 그리고 User를 get_user_model()이라는 함수로 가져와도 되고, 아니면 우리가 생성한 User 모델을 가져와도 됩니다. 즉, 아래 코드 2가지 중 한 가지 방법을 쓰면 됩니다. 주로 get_user_model() 함수를 씁니다.

    User = get_user_model() # 첫 번째 방법
    
    from accounts.models import User # 두 번째 방법

     

    그리고 해당 User 객체를 UserCreationForm을 상속받은 SignupForm에 Meta 클래스를 정의해 주고, UserCreationForm.Meta를 상속받은뒤 model에 할당해주시면 됩니다. 코드로는 아래와 같습니다.

    accounts/forms.py

     

    3) views.py

    이후, 방금 정의한 SignupForm을 View에서 form_class에 넣어주시면, 회원 가입이 정상적으로 작동하게 됩니다.

    accounts/views.py

     

     

    Reference
    1. django Logo: https://codecondo.com/jobs-for-django-developers/django-framework-logo/
    2. content: https://stackoverflow.com/questions/17873855/manager-isnt-available-user-has-been-swapped-for-pet-person

     

     

    반응형

    댓글

    Designed by JB FACTORY